为什么特定的windows批处理参数会导致崩溃



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外壳的转义符是^,所以:

"^^!"

每个^^变成^

每个^&变成&

所以最终你会得到:

"^!^^&^^^^"

最新更新