cmd可以工作,但C:\ Windows \ System32 \ cmd.exe没有

时间:2014-04-29 13:40:54

标签: windows command-line cmd

我试图通过在命令提示符下放置以下行来调用一个可执行文件。 (我知道我可以直接调用exe,但是我只是说由于某些限制我没办法这样做)

"cmd /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"

本身已成功运行。 /Ccmd.exe的参数。但是当我这样做时

"C:\Windows\System32\cmd.exe /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"

给我错误

The directory name is invalid

知道为什么吗?我该如何解决这个问题?我必须使用cmd.exe的完整路径。

5 个答案:

答案 0 :(得分:4)

请改为尝试:

"C:\Windows\System32\cmd.exe" /C " "C:\\Program Files\ABC\xyz.exe" -register="abc" "

例如:

"C:\Windows\System32\cmd.exe" /C " echo "Hello World" "
"C:\Windows\System32\cmd.exe" /C " python -c " print 'Hello World' "

这些工作没有任何问题,它们都输出" Hello World"

答案 1 :(得分:2)

如Stephan所述,正确的写作方式是以下一些选项

"C:\Windows\System32\cmd.exe" /C ....
"%comspec%" /c ....

问题是Why "cmd /c" .... works?它适用于解析器解释该行的方式。

当线路被解析并解析时,"cmd /c"将转换为

execute the command interpreter with the /c" ... arguments 

所以它被执行为

%comspec% /c ".....

这种替代可以很容易地进行测试

set "ComSpec=c:\windows\system32\calc.exe"
"cmd /c" echo hello

答案 2 :(得分:1)

看起来很奇怪:/

C:\Windows\System32\cmd.exe /C " "C:\\Program Files\ABC\xyz.exe" -register="abc" "

这很有效。不知道为什么。可能是"C:\\Program Files\ABC\xyz.exe" -register="abc"之前和之后的双引号。希望有人能解释一下。

答案 3 :(得分:1)

"C:\Windows\System32\cmd.exe /C"

查找名为C:\Windows\System32\cmd.exe /C的文件。

您是否曾见过扩展名为.exe /c的文件?

正确的格式是:

"C:\Windows\System32\cmd.exe" /C 

答案 4 :(得分:1)

关于为什么需要额外引号的其他问题:cmd /?返回的帮助中对此进行了描述,具体为

  

如果指定了/ C或/ K,那么后面的命令行的其余部分   交换机作为命令行处理,其中包含以下逻辑   用于处理引号(")字符:

1.  [Special case, not relevant here]

2.  Otherwise, old behavior is to see if the first character is
    a quote character and if so, strip the leading character and
    remove the last quote character on the command line, preserving
    any text after the last quote character.

因此,如果命令的第一个(非空白)字符是引号,则整个命令周围需要一对额外的引号。


补充说明:将MC ND的答案与我的答案相结合,问题中的第一个命令行将被解释为:我们从

开始
"cmd /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"

成为

%ComSpec% /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"

由于替换cmd - >的规则%ComSpec%结合丢弃额外引号的错误/功能;然后变成

"C:\\Program Files\ABC\xyz.exe" -register="abc

因为在处理/C时删除了第一个和最后一个引号的规则。

Win32文件系统规则会丢弃额外的反斜杠,因此启动的可执行文件是

C:\Program Files\ABC\xyz.exe

并且可执行文件可能忽略了其参数中缺少的close-quote。