Windowsコマンドプロンプトでオプションとパラメータを取り分ける
Windowsコマンドにある様なオプション(「/R」や「/T」等)と、処理対象のパス等のパラメータ部分を取り分ける実装をしてみました。VBScriptではもともとサポートしている様(WScript.Arguments.Named(“R”)の様にオプションを、WScript.Arguments.Unnamed(0)の様にパラメータを取得)ですが、Windowsコマンドプロンプトのコマンドでは実装が必要そうでした。
以下に今回実装したコードを示しますがコードが長くなってしまったので、先に要点を整理しておきます。今回は、再起フラグ(/Rまたは/rで指定)、テストモードフラグ(/Tまたは/tで指定)の2種類のオプションを想定しました。初期値はオプション指定なし(=0)で初期化しています。GOTO文を使って、バッチコマンドに渡された引数が全て処理されるまでをWhile〜Loopとして実装しています。
バッチコマンドに渡された引数が想定したオプションだった場合は、該当するオプションフラグをON(=1)に更新する様にしました。それ以外はARG1、ARG2、ARG3・・・という環境変数名で、オプションを除き指定された順番で格納される様にしました。以下は細かい確認や調整を行っていないコードなので参考にされる方はご注意下さい。
REM ------------------------------------------------
REM 引数解析処理(オプションとパラメータの分割)
REM ------------------------------------------------
REM 再帰フラグをOFFで初期化
SET OPT_RECURSIVE=0
REM テストモードフラグをOFFで初期化
SET OPT_TESTMODE=0
REM パラメータのインデックス番号を初期化する。
SET ARGS_INDEX=0
REM 指定されたすべての引数を解析するためのWHILE-LOOPブロック
:START_PARSE_ARGMENTS
REM 次の引数を取得する(初回は%1)
SHIFT
SET TMP_ARGS=%0
REM TMP_ARGS環境変数の有無で該当引数が存在すると判断する。
IF DEFINED TMP_ARGS (
IF /I !TMP_ARGS! EQU /R (
REM [/R]再帰オプションが指定されていた場合は再帰フラグをONにする。
SET OPT_RECURSIVE=1
) ELSE IF /I !TMP_ARGS! EQU /T (
REM [/T]テストオプションが指定されていた場合はテストモードフラグをONにする。
SET OPT_TESTMODE=1
) ELSE (
REM 想定されたオプション以外の値は環境変数ARGn(nは1以上)にそのまま設定する。
SET /A ARGS_INDEX=%ARGS_INDEX%+1
SET ARG!ARGS_INDEX!=!TMP_ARGS!
)
) ELSE (
REM 引数が存在しなくなった場合は、引数解析処理を抜ける。
GOTO END_PARSE_ARGMENTS
)
GOTO START_PARSE_ARGMENTS
:END_PARSE_ARGMENTS
ECHO 再帰:%OPT_RECURSIVE%
ECHO テスト:%OPT_TESTMODE%
ECHO 引数1:%ARG1%
ECHO 引数2:%ARG2%
ECHO 引数3:%ARG3%
これを仮実装したtest.batの実行結果は以下です。「/r」が指定されているため再起が1になっていて、「/r」以外のパラメータが指定順に引数1、引数2、引数3と判定されています。
>test.bat /r .\test rr(.*) ee""$1 再帰:1 テスト:0 引数1:.\test 引数2:rr(.*) 引数3:ee""$1