3

この質問は(非常に)ばかげているようです。私はそれに対処できません:(

このバッチコードを試したとき:

if "%1" == "-i" (
set is = %2
echo. %is%
shift
)

2つ(またはそれ以上)の引数で呼び出された場合、機能しません。実際には空白を印刷します。「shift」コマンドも実行されません。実行されたコードを(最初に@echoをオフにせずに)見ると、「set」コマンドが完了していることがわかります。

どうしたの?

呼び出しの例:

c:\script.bat -i test -d bla
4

1 に答える 1

7

2つの問題があります。デフォルトでは、括弧内のステートメントのグループでは、setコマンドの前に、変数の展開が一度に実行されます。また、のセマンティクスsetが間違っているため、の前後にスペースは必要ありません=

これをファイルの先頭に追加します。

setlocal ENABLEDELAYEDEXPANSION

=の周りのスペースを削除しますset

set is=%2

最後に使用された遅延拡張:

echo. !is!

SHIFT考えられる3番目の問題は、2つのsが必要になる可能性があることです。1つは引数用-i、もう1つはis引数用です。

アップデート

の構文エラーではないことを指摘してくれた@dbenhamに感謝しますset。これは、少し説明するに値する驚くべき動作です。これらのコマンドを実行する場合:

set a=one
echo "%a%"

結果は次のとおりです。

"one"

それは理にかなっていますが、試してみてください。

set b = two
echo "%b%"

そして、あなたは得る:

"%b%"

何?bこれは、環境変数が設定されていない場合に予想されることです。しかし、私たちはそれを設定しただけです。または私たちがしました:

echo "%b %"

表示:

" two"

Windowssetコマンドの場合、私が知っている他の言語や環境とは異なり、スペースは重要です。前のスペース=は環境変数名の一部になり、後のスペースは値の一部になります。この珍しい動作は、Windowsバッチプログラムを作成する際のエラーの一般的な原因です。

于 2012-12-10T08:59:49.473 に答える