什么事情正在发生?
helper.bat
@echo off
echo %1
call:foo %1
goto:eof
:foo
echo %1
goto:eof
运行我们的脚本,如下所示
帮助者“^^^^”
输出
“^^^^”
“^^^^^^^^”
为什么呢?我知道在cmd.exe的情况下,'^'符号是特殊的,但是这里发生了什么?函数调用如何影响它?
答案 0 :(得分:3)
CALL
非常特别!
批处理解析器有不同的阶段,在特殊字符阶段未加引号插入符号用于转义下一个字符,插入符本身被删除。
在您的情况下,引用了插入符号,因此它们不会受到影响。
然后,在延迟扩展阶段,插入符号会再次受到影响,但引号并没有特别的含义,插入符只用于逃避感叹号。
通常在延迟阶段完成所有操作后,但如果您使用CALL
所有插入符都加倍。
通常这是不可见的,因为CALL
也会重新启动解析器并再次在特殊字符阶段删除插入符号。
但在你的情况下,他们被引用,因此他们保持加倍。
试试这个
call call call call echo a^^ "b^"
输出
a^ "b^^^^^^^^^^^^^^^^"
解析器在How does the Windows Command Interpreter (CMD.EXE) parse scripts?
解释