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

标签 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!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/

相关文章:

windows - FTP 将目录中的所有文件复制到本地目录

c++ - Windows 线程-C++

powershell - 从批处理重定向到Powershell

windows - 批处理文件中的国际字符

python - 如何创建像 top unix 命令这样的 python shell 脚本?

c++ - 如何使用 SDL 在两个独立的声卡上播放声音?

c++ - 错误 C2065 : 'DWORD_PTR' : undeclared identifier

r - 在 Rscript.exe 中执行表达式

windows - 在目录/子目录中生成文件夹 list.txt 文件,并在批处理文件中使用 dir & ren 命令将 list.txt 重命名为文件夹/子文件夹名称

php exec() 响应与 Windows 8 Metro 应用程序不同