Windows 命令外壳中文件名周围的引号问题

Eli*_*sky 7 windows shell command-line

我运行的是 Windows XP Home SP3。尝试运行此命令:

cmd /c "C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c Win32-temp-Debug\getbuildinfo2.c
Run Code Online (Sandbox Code Playgroud)

它工作正常(忽略确切的程序和文件名)。但是,在引用最后一个参数时,出现错误:

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.
Run Code Online (Sandbox Code Playgroud)

当没有cmd /c但直接运行时,两个命令行都运行没有错误。我使用cmd /c来调试system从 C 程序调用时遇到的类似问题。

cmd这里有什么问题?

Den*_*son 9

这是help cmd关于引用的内容:

如果指定了 /C 或 /K,则切换后的命令行的其余部分将作为命令行处理,其中使用以下逻辑处理引号 (") 字符:

  1. 如果满足以下所有条件,则保留命令行上的引号字符:

    • 没有 /S 开关
    • 正好两个引号字符
    • 两个引号字符之间没有特殊字符,其中 special 是以下之一: &<>()@^|
    • 两个引号字符之间有一个或多个空格字符
    • 两个引号字符之间的字符串是可执行文件的名称。
  2. 否则,旧的行为是查看第一个字符是否是引号字符,如果是,则去掉前导字符并删除命令行上的最后一个引号字符,保留最后一个引号字符之后的任何文本。

因此,将第一个和最后一个引号加倍,它应该可以工作:

cmd /c ""C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c "Win32-temp-Debug\getbuildinfo2.c""
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于 [`system`](https://msdn.microsoft.com/en-us/library/277bwbdz.aspx),因此不要忘记整个命令周围的额外一对引号! (2认同)