0

我在 Windows XP 上有一个行为异常的批处理文件。它包含:

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 未被识别为内部或外部命令”。我确定从命令行运行时 - 不涉及批处理文件 - 我必须插入克拉来逃脱管道。但是在批处理文件中,如果我有克拉,它就不起作用,如果我没有,它就不起作用!

另一件奇怪的事情是 SetLocal 似乎没有任何效果,因为在批处理文件运行后,my.properties 中的所有属性都可以通过“set”看到。'set' 的输出中有一些东西叫做 ARGV。

感谢您的帮助,保罗

4

2 回答 2

1

编辑的答案

我傻了,我终于弄清楚了问题所在。

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 应该可以正常工作。

于 2012-10-05T14:44:17.913 回答
1

我最终确实让这个工作了。

as-create-launch-config 是一个 Amazon AWS 工具,不是我可以控制的,所以修改它不是一个选项。

我尝试了所有我能找到的关于转义和引用等的建议 - 没有任何区别。当我不使用“调用”时,一切正常,但当然只有脚本中的第一个命令会在这种情况下运行。所以我介绍了一个间接级别 - 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 回答