编辑的答案
我傻了,我终于弄清楚了问题所在。
CALL 语句将所有引用的插入符号加倍,因此您的代码实际上正在传递:
"a=%VAR1%^^|b=%VAR2%^^|c=%VAR3%"
您可以通过将带引号的字符串存储在变量中,然后使用加倍百分比来延迟变量的扩展,直到插入符号加倍后,才能解决该问题。
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 问题 - 通常,一旦脚本终止,在 SETLOCAL 之后设置的所有值都应该被清除,即使没有明确的 ENDLOCAL。但是,我发现了一个令人讨厌的行为(错误?),可以解释您的结果。不幸的是,如果调用的例程或脚本中存在致命错误,则 SETLOCAL 仍然存在。请参阅我的 DosTips post SETLOCAL 在批处理终止后继续!. 阅读整个线程。
消除致命错误后,SETLOCAL 应该可以正常工作。