0

WindowsXPに奇妙な動作をしているバッチファイルがあります。を含む:

SetLocal
FOR /f "delims=" %%x in (my.properties) DO (set "%%x")
call as-create-launch-config X --region us-east-1 --user-data "a=%VAR1%^|b=%VAR2%^|c=%VAR3%"
call as-create-launch-config Y --region us-east-1 --user-data "d=%VAR4%^|e=%VAR5%^|f=%VAR6%"

VARx変数は正しく設定されているようです。

「bは内部コマンドまたは外部コマンドとして認識されません」というエラーが表示されます。コマンドラインから実行する場合(バッチファイルは含まれません)、パイプをエスケープするためにカラットを挿入する必要がありました。しかし、バッチファイルでは、カラットがある場合は機能せず、ない場合は機能しません。

もう1つの奇妙な点は、バッチファイルの実行後にmy.propertiesのすべてのプロパティが「set」で表示されるため、SetLocalが効果を発揮していないように見えることです。そして、「set」の出力にはARGVと呼ばれるものがあります。

助けてくれてありがとう、ポール

4

2 に答える 2

1

編集された回答

ばかげて、私はついに問題を理解しました。

CALL ステートメントは引用符で囲まれたすべてのキャレットを 2 倍にするため、コードは実際に次のように渡します。

"a=%VAR1%^^|b=%VAR2%^^|c=%VAR3%"

引用符で囲まれた文字列を変数に格納し、2 倍のパーセントを使用して、キャレットが 2 倍になるまで変数の展開を遅らせることで、この問題を回避できます。

SetLocal
FOR /f "delims=" %%x in (my.properties) DO (set "%%x")
set arg="a=%VAR1%^|b=%VAR2%^|c=%VAR3%"
call as-create-launch-config X --region us-east-1 --user-data %%arg%%
set arg=""d=%VAR4%^|e=%VAR5%^|f=%VAR6%"
call as-create-launch-config Y --region us-east-1 --user-data %%arg%%

Windows コマンド インタープリター (CMD.EXE) はどのようにスクリプトを解析しますか?を参照してください。キャレットの倍増に関する情報を含む、バッチ解析の仕組みの詳細については。

追加のスクリプトに頼らずに、回答で見つけたソリューションを実装することもできます。DosTips ユーザーの Liviu によって発見された予期しないジャンプを回避するために、驚くべきことにこのソリューションには括弧が必要です。

SetLocal
FOR /f "delims=" %%x in (my.properties) DO (set "%%x")
call :sub1
call :sub2
exit /b

:sub1
(as-create-launch-config X --region us-east-1 --user-data "a=%VAR1%^|b=%VAR2%^|c=%VAR3%")

:sub2
(as-create-launch-config Y --region us-east-1 --user-data "d=%VAR4%^|e=%VAR5%^|f=%VAR6%")


SETLOCAL ソリューション

SETLOCAL の問題に関して - 通常、明示的な ENDLOCAL がない場合でも、スクリプトが終了すると、SETLOCAL の後に設定されたすべての値をクリアする必要があります。ただし、結果を説明する厄介な動作 (バグ?) を発見しました。残念ながら、呼び出されたルーチンまたはスクリプトに致命的なエラーがある場合、SETLOCAL は存続します。DosTips の投稿を参照してください. スレッド全体を読んでください。

致命的なエラーを解消すると、SETLOCAL は正しく機能するはずです。

于 2012-10-05T14:44:17.913 に答える
1

私は最終的にこれを機能させました。

as-create-launch-config は Amazon AWS ツールであり、私が制御できるものではないため、それを修正することはできませんでした。

エスケープや引用などで見つけたすべての提案を試しましたが、違いはありませんでした。「call」を使用しなかった場合はすべて正常に機能しましたが、もちろん、その場合はスクリプトの最初のコマンドのみが実行されます。そこで、あるレベルの間接性を導入しました - script1 には次のものがあります。

call scriptA
call scriptB

scriptA は次のとおりです。

as-create-launch-config --user-data "a=%VAR1%^|b=%VAR2%^|c=%VAR3%"

そしてscriptBには次のものがあります:

    as-create-launch-config --user-data "d=%VAR4%^|e=%VAR5%^|f=%VAR6%"

それが私が結果を達成する唯一の方法でした。

于 2012-10-05T15:20:02.330 に答える