使用带转义序列的CALL ^

时间:2012-03-22 10:26:00

标签: batch-file

我必须通过CALL语句执行批处理文件并将参数传递给它。一切正常,直到我需要使用^符号。

我正在运行XP,可以通过两个简单的命令重现问题:

没有CALL

c:\>echo password: "secret(<^>)secret"
password: "secret(<^>)secret"

使用CALL

c:\>call echo password: "secret(<^>)secret"
password: "secret(<^^>)secret"

使用CALL时如何避免不复制^符号?

1 个答案:

答案 0 :(得分:2)

通过这种方式你无法避免它,因为CALL将在第二次重新分配线之前将所有插入符号加倍。

如果你真的需要使用CALL,你应该把你的数据放在一个变量中,并在CALL-caret-doubleling之后展开它

set "myVar=secret(<^>)secret"
set myVar
call echo Password "%%myVar%%"

但即便如此,如果您的秘密包含引号,或者您尝试使用不带引号的变量,那么您会遇到问题。

因此,您最好在这里使用延迟扩展 这也可以在括号内工作(没有CALL)。

setlocal EnableDelayedExpansion
(
    set "myVar=secret(<^>)secret"
    echo !myVar!
)

如果你对双重插入符来自哪里感兴趣,你可以阅读 How does CMD.EXE parse scripts