![Windows 命令 shell 中文件名引号的问题](https://linux22.com/image/1263526/Windows%20%E5%91%BD%E4%BB%A4%20shell%20%E4%B8%AD%E6%96%87%E4%BB%B6%E5%90%8D%E5%BC%95%E5%8F%B7%E7%9A%84%E9%97%AE%E9%A2%98.png)
我正在运行 Windows XP Home SP3。尝试运行此命令:
cmd /c "C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c Win32-temp-Debug\getbuildinfo2.c
它运行正常(忽略确切的程序和文件名)。但是,引用最后一个参数时,我收到错误:
cmd /c "C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c "Win32-temp-Debug\getbuildinfo2.c"
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
当直接运行而不使用时cmd /c
,两个命令行均无错误运行。我使用来调试我在 C 程序调用cmd /c
时遇到的类似问题。system
这里有什么问题cmd
?
答案1
help cmd
关于引用,有这样的说法:
如果指定了 /C 或 /K,则开关后的命令行其余部分将作为命令行进行处理,其中使用以下逻辑来处理引号(“)字符:
如果满足以下所有条件,则命令行上的引号字符将被保留:
- 没有 /S 开关
- 正好两个引号字符
- 两个引号字符之间没有特殊字符,特殊字符包括以下字符之一:&<>()@^|
- 两个引号字符之间有一个或多个空格字符
- 两个引号之间的字符串是可执行文件的名称。
- 否则,旧的行为是查看第一个字符是否是引号字符,如果是,则删除前导字符并删除命令行上的最后一个引号字符,保留最后一个引号字符后的任何文本。
因此,将第一个和最后一个引号加倍,它应该可以起作用:
cmd /c ""C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c "Win32-temp-Debug\getbuildinfo2.c""