【急ぎです】

Windows XPのコマンドラインで、環境変数hogeの値が空(環境変数hogeがない)かどうかcmd.exeのifで調べたいのですが、お知恵を貸して下さい。
>if ""=="%hoge%" echo hogeは空です
…のようなことをしたい訳なのですが、空の環境変数hogeの展開結果は「%hoge%」になってしまう様子。
>set hoge=ABC
>echo %hoge%
ABC
>set hoge=
>echo %hoge%
%hoge%
↑あれれ?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/10/01 13:50:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tokuya_n No.1

回答回数56ベストアンサー獲得回数7

ポイント300pt

>echo %hoge%

%hoge%

になるということは、コマンドプロンプトに直接入力してる、のでしょうか?

IFなどの条件分岐はバッチファイルでしか使えないはずです。

バッチファイルであれば

if "" == "%hoge%" ( echo 空 ) else echo 空じゃない

で問題ないはずです。

id:Kityo

 回答ありがとうございます。

 僕の質問文が舌足らずでしたか?

 実際に僕の手元のWindows XPでは、「if ""=="%hoge%" echo hogeは空です」では問題があるのです。tokuya_nのお手元のWindows XP(のcmd.exe)ではWin9X(のcommand.com)と同じに振舞うのでしょうか?


 …ところで「else」なんて使えるのかと思って「if /?」を試したら、「if [not] DEFINED 環境変数名」なんて構文を発見しました。

 この構文なら気持ち良くコーディング出来そうです。

 従って解決しました。僕が自力で解決したように見えるかも知れませんが、tokuya_nさんの回答があってこそ「if /?」を試したのです。

 感謝致します。本当にありがとうございます。


※ifコマンド自体は、コマンドプロンプト直接入力でも使えますよ!?

2006/10/01 13:48:44
  • id:Kityo
     暫定的な案として下記のようなことをしていますが、もうちょっと綺麗で、出来ればWin9Xのスクリプト使い(スクリプトプログラマ)にも読めるような構文があれば…と思います。
    >if "%%hoge%%"=="%hoge%" echo hogeは空です
  • id:tokuya_n
    > 実際に僕の手元のWindows XPでは、「if ""=="%hoge%" echo hogeは空です」では問題があるのです
    はて... ちょっと私何か勘違いしてるかな?


    if "" == "%hoge%" ( echo 空 ) else echo 空じゃない
    set hoge=ABC
    echo %hoge%
    if "" == "%hoge%" ( echo 空 ) else echo 空じゃない
    set hoge=
    echo %hoge%
    if "" == "%hoge%" ( echo 空 ) else echo 空じゃない

    のバッチを流したら
    > 空
    > 空じゃない
    > 空
    になったのでOKかと思ってしまったのですが。


    見当違いのことを回答してしまったようで申し訳ない。
    問題自体は解決なされたようですので、おめでとうございます。
  • id:Kityo
     tokuya_nさん、僕のほうも勘違いしていたようです。
     XPのバッチファイルの中では、"%未定義変数%"は""に展開されるのが通常の様子でした。
     XPの直接コマンドライン入力では、"%未定義変数%"は"%未定義変数%"に展開されます。(ここがXPと9xで異なる)
     forコマンドを絡めたときの挙動が通常と違っていたので混乱していたみたいです。
     やりたかったことはこんな感じでした。
      -----
      @echo off
       set hoge.1=ABC
       set hoge.2=
       set hoge.3=xyz
       set hoge.4=
       set foo.1=default
       set foo.2=default
       set foo.3=default
       set foo.4=default
    →  for %%i in ( 1 2 3 4 ) do for /F "usebackq" %%A in (`echo %%hoge.%%i%%`) do if defined hoge.%%i set foo.%%i=%%A
       echo foo.1=%foo.1% foo.2=%foo.2% foo.3=%foo.3% foo.4=%foo.4%
      -----

     当初→の行を「for %%i in ( 1 2 3 4 ) do for /F "usebackq" %%A in (`echo %%hoge.%%i%%`) do if ""=="%%A" set foo.%%i=%%A」とコーディングしていたところ上手く行かず、「for %%i in ( 1 2 3 4 ) do for /F "usebackq" %%A in (`echo %%hoge.%%i%%`) do echo if ""=="%%A" set foo.%%i=%%A」に変えて様子を見たら
      -----
      if ""=="ABC" set foo.1=ABC
      if ""=="%hoge.2%" set foo.2=%hoge.2%
      if ""=="xyz" set foo.3=xyz
      if ""=="%hoge.4%" set foo.4=%hoge.4%
      -----
    …の様だったので、良く調べもせずにこの質問に至りました。
     いずれにせよ、勉強になりました。
     ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません