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

为什么特定的windows批处理参数会导致崩溃?,windows,batch-file,cmd,Windows,Batch File,Cmd,test.bat的内容包括: setlocal EnableExtensions EnableDelayedExpansion set param1=%~1 echo %param1% 有人能解释一下为什么test.bat“^^!^^^ ^&^ ^ ^ ^ ^ ^ ^ ^”使cmd窗口崩溃,但test.bat“^ ^ ^ ^&^ ^ ^ ^ ^ ^ ^ ^ ^”具有将设置为变量param1的预期结果吗 我可以通过test.bat“pass^^!word”得到预期的pass结果!字 更新:tes

test.bat的内容包括:

setlocal EnableExtensions EnableDelayedExpansion
set param1=%~1
echo %param1%
有人能解释一下为什么
test.bat“^^!^^^ ^&^ ^ ^ ^ ^ ^ ^ ^”
使cmd窗口崩溃,但
test.bat“^ ^ ^ ^&^ ^ ^ ^ ^ ^ ^ ^ ^”
具有将
设置为变量param1的预期结果吗

我可以通过
test.bat“pass^^!word”
得到预期的pass结果!字


更新:
test.bat“^^!^^^^&^^^^^^^”
works。但我不完全确定为什么。这将被解释为
set param1=^^^&^^^^。为什么“^”前面需要^^^^?

这是因为Windows shell的转义字符是^,所以:

“^^!^^^^^^&^^^^^^^”

每个^^变成^

每个^成为&

所以最后你会得到:


“^!^^&^^^^”

您遇到了许多问题,因为在您的案例中,特殊字符将被计算多次

首先在
set
命令中,特殊字符阶段将把字符串
“^^^!^^^^ ^&^^^^^^^”
减少到
^^&^^
但由于启用了延迟扩展,并且字符串包含感叹号,
将启用另一个阶段,以将插入符号再次减少到。
&^

此时,
param1
包含
&^,您可以使用
设置参数1

但是,当您尝试使用
echo%param1%
回显该值时,将执行另一个扩展。
现在您遇到了一个问题,因为
%param1%
将扩展到
&^
感叹号将被删除,因为展开变量时缺少第二个表示符号,
符号and将被视为新的命令分隔符,
结束插入符号将被视为多行字符。
echo!&^

在这里使用延迟扩展要安全得多,因为这永远不会改变内容,因为这个阶段是解析器的最后一个阶段

setlocal EnableDelayedExpansion
set param1=%~1
set param1
echo !param1!

所有这些解释都可以在

中找到,可能是因为当您启用延迟扩展
时,
有一个特殊的含义,你需要逃避它。不,他不会得到
“^!^^^&^^^^^”
,引号会被
%~1
中的波浪线删除,更多的插入符号会被标记删除。但只有在他使用“EnableDelayedExpansion”时,。。。我想。。??是/否?是,仅当启用了LayedExpansion且行中的任意位置至少有一个感叹号时,才对插入符号进行引号内外求值<代码>回显“^^^^^^^^^^^^^x结果发送到
“^^^x