我必须通过 CALL 语句执行批处理文件并向其传递一个参数。一切正常,直到我需要使用 ^ 符号。
我运行的是 XP,可以通过两个简单的命令重现该问题:
没有CALL
c:\>echo password: "secret(<^>)secret"
password: "secret(<^>)secret"
通过调用
c:\>call echo password: "secret(<^>)secret"
password: "secret(<^^>)secret"
如何避免在使用 CALL 时不重复 ^ 符号?
最佳答案
通过这种方式,您无法避免它,因为 CALL
始终会在第二次重新解析该行之前将所有插入符号加倍。
如果您确实需要使用CALL
,您应该将数据放入变量中,并在 CALL-caret-doubling 之后展开该变量
set "myVar=secret(<^>)secret"
set myVar
call echo Password "%%myVar%%"
但即使如此,如果您的 secret 包含引号,或者您尝试使用不带引号的变量,您也会遇到问题。
因此这里最好使用延迟扩展。
这也适用于括号内(无需 CALL)。
setlocal EnableDelayedExpansion
(
set "myVar=secret(<^>)secret"
echo !myVar!
)
如果您对双插入符的来源感兴趣,您可以阅读
How does CMD.EXE parse scripts
关于batch-file - 使用带转义序列的 CALL ^,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9820405/