3

入力パラメーターのセットをコマンドとして受け取るコマンドラインユーティリティに取り組んでいます。これらの入力パラメーターは、定義済みの名前に対して検証されます。このユーティリティは、次の方法で呼び出されます。

runUtility.cmd -A -B x,y,z -C w

ここで、パラメーターは A、B、および C (- で始まるもの) です。現在、検証ルールは次のとおりです。

  1. -UVW などの無効なパラメータを渡すことができないように、パラメータの名前は定義済みの名前と一致する必要があります。

  2. パラメータには値がある場合とない場合があります。上記の例では、-A には値がありませんが、-B には x、y、z があり、-C には w があります。

入力を検証するために次のコードを作成しました。

:validate

set argument=%1
set argumentValue=%2


if "%argument%" == "-A" (   
    shift   
    goto validate
)

if "%argument%" == "-B" (
    if "%argumentValue%" == "" (
        echo Empty value for -B
        goto end
    )
    shift
    shift 
    goto validate       
)

if "%argument%" == "-C" (
    if "%argumentValue%" == "" (
        echo Empty value for -C
        goto end
    )
    shift
    shift  
    goto validate      
)

if %argument%" == "" (
        goto end
)

Argument %argument% is invalid

:end        

しかし、これは機能していないようです。-B にはカンマ区切りの値があるため、B が 2 つのシフトを実行すると、次の反復で y が %1 になり、z が %2 になります。y はパラメーターではないため、「引数 y が無効です」というコードの最後の行で失敗します。実際にはコンマは SHIFT コマンドによって区切り文字として使用されるため、x、y、z は単一の値のままです。

x、y、z を単一の値として取得したい、またはこれを処理する他の方法はありますか? 私はバッチ スクリプトに少し慣れていません。FOR ループを試しましたが、すべての反復で %1 と %2 を一緒に取得できませんでした。

4

2 に答える 2

10

バッチでは、スペース、コンマ、セミコロン、タブ、および等号の任意の組み合わせを使用して区切りパラメーターを使用します。これらの文字のいずれかをパラメーターに含める場合は、パラメーターを引用符で囲む必要があります。

runUtility.cmd -A -B "x,y,z" -C w

スクリプトは、~修飾子を使用して囲み引用符を削除できます。&また、 、 などの問題のある文字から保護するために、割り当て全体を引用符で囲むことをお勧めします|。以下の割り当ての二重引用符は値に含まれません。

set "argumentValue=%~2"


あなたが見たいと思うかもしれないオプションパーサーを開発しました: Windows Bat file optional argument parsing .

どのオプションを定義しても、構文解析コードはほとんど変わりません。SHIFT /3変更する必要があるのはSHIFT /1、単一の変数を使用したオプションの定義だけです。%~3%~1%~4%~2

オプション パーサーには、指定されていないオプションのデフォルト値を自動的に指定する機能があります。

デフォルト値がないと仮定すると、オプションは次のように定義されます

set "options=-A: -B:"" -C:"""

-A値を取らないオプションと、値を取るがデフォルトでは未定義のオプションを-B意味-Cします。

オプションは、オプション名 (ダッシュを含む) に一致する変数に格納されます。

于 2012-11-09T18:38:15.577 に答える
0

これがあなたを動かすための何かです、それは3つのパラメーター、ABCに基づいており、それぞれがスペースで区切られた最大3つのパラメーターを持っています。すべてをまとめる時間がないので未完成ですが、必要に応じて微調整できる何かを使用できるはずです。

@echo off
set p1=%1
set p2=%2
set p3=%3
set p4=%4
set params=(-A -B -C)
for %%x in %params% do (
if "%p1%"=="" (
echo No parameters given
exit /b >nul
) else (
if "%p1%"=="%%x" (
if not "%p4%"=="" (
echo %%x has 3 parameters
) else (
if not "%p3%"=="" (
echo %%x has 2 parameters
) else (
if not "%p2%"=="" (
echo %%x has 1 parameter
)
)
)
)
)
)
于 2012-11-09T17:01:11.643 に答える