test.bat 的内容是:
setlocal EnableExtensions EnableDelayedExpansion
set param1=%~1
echo %param1%
有人可以解释为什么 test.bat "^^!^^^&^^^^"
使 cmd 窗口崩溃但 test.bat "^^^&^^^ ^"
具有将 &^
设置为变量 param1 的预期结果?
我可以执行 test.bat "pass^^!word"
并得到 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!
所有这些解释都可以在 How does CMD.EXE parse scripts? 找到
关于windows - 为什么特定的 Windows 批处理参数会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981168/