我试图通过在命令提示符下放置以下行来调用一个可执行文件。 (我知道我可以直接调用exe,但是我只是说由于某些限制我没办法这样做)
"cmd /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"
本身已成功运行。 /C
是cmd.exe
的参数。但是当我这样做时
"C:\Windows\System32\cmd.exe /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"
给我错误
The directory name is invalid
知道为什么吗?我该如何解决这个问题?我必须使用cmd.exe的完整路径。
答案 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。