本帖最后由 WHY 于 2023-2-15 13:33 编辑
CMD /? 帮助里有说明:
如果指定了 /C 或 /K,则会将该开关之后的
命令行的剩余部分作为一个命令行处理,其中,会使用下列逻辑
处理引号(")字符:
1. 如果符合下列所有条件,则会保留
命令行上的引号字符:
- 不带 /S 开关
- 正好两个引号字符
- 在两个引号字符之间无任何特殊字符,
特殊字符指下列字符: &<>()@^|
- 在两个引号字符之间至少有
一个空格字符
- 在两个引号字符之间的字符串是某个
可执行文件的名称。
2. 否则,老办法是看第一个字符
是否是引号字符,如果是,则去掉首字符并
删除命令行上最后一个引号,保留
最后一个引号之后的所有文本。 - Start /wait /b Cmd /c "子 程序.cmd" "%Scd%"
复制代码 这条命令有4个引号字符,不满足条件1,预处理时会删掉首尾引号,执行的其实是:- Start /wait /b Cmd /c 子 程序.cmd" "C:\Program Files (x86)\Common Files
复制代码 这个时候 '子' 会被当做一个可执行的命令,后面的 程序.cmd" "C:\Program Files (x86)\Common Files 被当做 '子' 的参数。
解决办法其实很简单:
Start /wait /b Cmd /c ,"子 程序.cmd" "%Scd%"
预处理时CMD认为第一个字符是逗号,不是引号字符,引号就不会删除。然后逗号再解析成命令分隔符(与空格一样)。
曾经看到过这种办法:
Start /wait /b Cmd /c ""子 程序.cmd" "%Scd%""
因为引号对的位置发生变化,如果程序或参数中包含特殊字符,原来位于引号对里面的特殊字符暴露在引号对之外,会报错。 |