test.bat的内容为:
setlocal EnableExtensions EnableDelayedExpansion
set param1=%~1
echo %param1%
有人能解释一下为什么test.bat "^^!^^^&^^^^"
使cmd窗口崩溃,而test.bat "^^^&^^^^"
有将&^
设置为变量param1的预期结果吗?
我可以做test.bat "pass^^!word"
,我得到了预期的成绩!单词
更新:test.bat "^^!^^^^^&^^^^^^^^"
有效。但我不完全确定为什么。这被解释为set param1=^!^^&^^^^
。为什么^需要^^^在它前面?
您遇到了很多问题,因为在您的案例中,特殊字符将被多次评估。
首先在set
命令中,特殊字符阶段会将字符串"^^!^^^&^^^^"
减少为^!^&^^
但由于启用了延迟扩展,并且字符串中包含感叹号,
将启用另一个阶段,以将插入符号再次减少到。!&^
此时param1
包含!&^
,您可以使用set param1
进行测试
但是,当您尝试用echo %param1%
回显该值时,将执行另一个扩展
现在您遇到了一个问题,因为%param1%
将扩展到!&^
,
感叹号将被删除,因为扩展变量时缺少第二个感叹号,
与号将被视为新命令分隔符和
结束插入符号将被视为多行字符echo ! & ^<next line>
在这里使用延迟扩展要安全得多,因为这永远不会改变内容,因为这个阶段是解析器的最后一个阶段。
setlocal EnableDelayedExpansion
set param1=%~1
set param1
echo !param1!
所有这些解释都可以在CMD.EXE如何解析脚本?
这是因为Windows外壳的转义符是^,所以:
"^^!"
每个^^变成^
每个^&变成&
所以最终你会得到:
"^!^^&^^^^"