バッチファイルには古くからお世話になっていますが、その長い歴史で最も特殊な機能です。もちろん、本家( Unix )にはそれこそ昔からあるのですけれど。 まず、標準出力になにがしかを出力するコマンドを作る必要があります。VB.NET で作成して、vbc.exe でビルドして使えはいいのですが、もっと簡単に VBScript を使います。ここでは、ini.vbs というスクリプトを元に話をすすめていきます。 ini.vbs はini ファイルの中の値を取り出す簡単なスクリプトです。例えば php.ini の中に[PHP] error_reporting = E_ALL & ~E_NOTICE & ~E_STRICTと書かれているとすると、cscript.exe //NOLOGO ini.vbs "php.ini" php error_reporting で、E_ALL & ~E_NOTICE & ~E_STRICT を標準出力に出力します。 ですが、このままではコマンドとして使うには cscript.exe を毎回書く必要があるので、同じディレクトリにini.bat を作成して、以下のように書きます。@echo off cscript.exe //NOLOGO "%~dp0ini.vbs" "%1" %2 %3そして、この二つのファイルをパスの通ったディレクトリに置くと、"ini" というコマンドの出来上がりです。 で、このコマンドを使ったバッチファイルが以下のようになります
@echo off SETLOCAL SET ini_var= For /F "delims=" %%i in ('ini.bat "c:\php\php.ini" php error_reporting') do ( if "%%i"=="E_ALL & ~E_NOTICE & ~E_STRICT" (call :type1) else (call :type2) ) if "%ini_var%"=="" (call :type3) goto :end :type1 echo ****************** echo エントリ一致 echo ****************** SET ini_var=type1 exit /b :type2 echo ****************** echo エントリ不一致 echo ****************** SET ini_var=type2 exit /b :type3 echo ****************** echo エントリなし echo ****************** exit /b :end ENDLOCAL
SETLOCAL は、ENDLOCAL までの間に使った環境変数をクリアして元に戻すという、バッチファイルのためにある都合のいいコマンドです。 こうしておくと、いろいろ都合のいい処理を if "%環境変数%"=="内容"として実行が可能になりますし、内容を直接実行はそもそもの機能です。 (例) SET MYVAR=DIR %MYVAR% しかし、この処理のメインは 'ini.bat "c:\php\php.ini" php error_reporting' で、このコマンドが標準出力に表示した結果が %%i にセットされます。これを使って、内部サブルーチンを呼び出しています。 "delims=" は、デフォルトだと空白が区切り文字になってしまって、値に空白が含まれると変数に正しく入らないので、区切文字をなしにする書き方です。 その結果、戻された値と E_ALL & ~E_NOTICE & ~E_STRICT が等しい場合は type1 の処理を実行し、一致しなければ type2 の処理を実行します。エントリが無い場合や、エントリの値が空白の場合は、type3 の処理を実行します。 ちなみに、Microsoft の Visual Studio の中にバッチビルド用のバッチファイルがあるのですが、その中でこんな感じの処理をしています。あっちでは、reg.exe でレジストリの中の内容によって処理変えてましたが、整理するとこういう事だったわけです。 ※ For は複数のループなので、標準出力の結果が複数行の場合は、複数回処理されます