編集された回答
ばかげて、私はついに問題を理解しました。
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 は正しく機能するはずです。