みちしるべ RSSフィード

2009-09-03

\Microsoft の使い方が誤っています。

入門 4.基本文法 (2)if文の注意事項

コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ



昨日ifの条件文で以下の書き方をした。

  IF {%ARG1%}=={%ARG2%} 

通常は以下の書き方が多いと思う。

IF "%ARG1%"=="%ARG2%"

しかしこの場合値に 「"」が含まれるとエラーになってしまう。

例えば、バッチのパラメータに空白を含むディレクトリ

指定するために、""でくくった場合など。


NGなパターンのバッチファイル
IF "%1"=="%2" (
  echo equal.
) ELSE (
  echo not equal.
)

%1,%2はコマンドパラーメターを表す特別な変数

NGなパターンの実行結果
c:\>D:\MyDoc\work\#blog\コマンドプロンプト\if-error.bat "C:\Documents and Settings\orangeclover" "C:\Documents and Settings\orangeclover"
and の使い方が誤っています。

c:\>IF ""C:\Documents and Settings\orangeclover""==""C:\Documents and Settings\orangeclover"" (


OKなパターンのバッチファイル
IF {%1}=={%2} (
  echo equal.
) ELSE (
  echo not equal.
)

OKなパターンの実行結果
c:\>D:\MyDoc\work\#blog\コマンドプロンプト\if-{}.bat "C:\Documents and Settings\orangeclover" "C:\Documents and Settings\orangeclover"

c:\>IF {"C:\Documents and Settings\orangeclover"} == {"C:\Documents and Settings\orangeclover"} (echo equal. )  ELSE (echo not equal. )
equal.


{}の代わりに''でくくる手もあるが、'09などのディレクトリもよくある。

{}もディレクトリ名に使えるの完全ではないが、"" ''よりは{}の方が確立が低いと

思う。


しかし、これでも罠が残っていた。

Windows Server 2003 x64版でテスト用にPATHを設定しようと以下のようなバッチを

組んでいた。


if {%1} == {%2} (
setlocal
set PATH=%NORMAL_TEST_HOME%\bin;%PATH%
endlocal
) else (
set PATH=%ERROR_TEST_HOME%\bin;%PATH%
)

これが動かないのである。

Microsoft の使い方が誤っています。

なんじゃそりゃ


C:\>test.bat a b
\Microsoft の使い方が誤っています。

C:\>test.bat a a
\Microsoft の使い方が誤っています。

x64版だと32bitモジュールはC:\Program Files (x86)に含まれるている。

そのため環境変数が以下のようになっている

C:\>set PATH=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\BIN\amd64;C:\Program Files (x86)\Mi
crosoft Visual Studio 8\VC\PlatformSDK\bin\win64\amd64;C:\Program Files (x86)\Microsoft Visual Studi
〜省略〜

そうするとPATHに含まれている()を誤認してしまうのだ。。。

回避として、IF文を2つにしたけど。。。


エラーにある通りだ。

()を含むディレクトリデフォルトにして、set PATHができないなんて

ホント 「Microsoft の使い方が誤っています。」だよ。