【问题标题】:cmd works but C:\Windows\System32\cmd.exe does notcmd 有效,但 C:\Windows\System32\cmd.exe 无效
【发布时间】:2014-06-15 11:49:11
【问题描述】:

我正在尝试通过在命令提示符下添加以下行来调用一个可执行文件。 (我知道我可以直接调用 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 的完整路径。

【问题讨论】:

  • 奇怪的是第一种格式有效......我可以重现这种行为,但我无法解释它!它不适用于cmd 以外的可执行文件,因此看起来它可能是硬编码的特殊情况。 :-(

标签: windows command-line cmd


【解决方案1】:

试试这个:

"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 或避免硬编码路径; "%COMSPEC%" /C "C:\Prog ..."
  • @GaneshS 好的,现在我明白你想要做什么了。你应该更清楚你的问题。但是,你去吧,编辑后的答案:D
  • 知道为什么会这样吗?根据我的解释,““abc”“xyz”“应该被解释为错误的格式,而不是嵌套的双引号。
【解决方案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

【讨论】:

  • 所以cmd 不同于(例如)notepadnotepad 在路径中搜索文件notepad.xxx,其中xxxbatcmdexe(在%pathext% 中的某个东西),而cmd 不搜索@ 987654337@,但似乎是一种“内部命令”,它执行%comspec%,可能像doskeymacro?
  • @Stephan,是的,它是不同的。我不知道它是否相关,但start 命令做了类似的事情。来自它的帮助When you run a command that contains a the string "CMD" as the first token without an extension or path qualifier, "CMD" is replaced with the value of the COMSPEC variable. This prevents users from picking up cmd from the current directory.
  • 看来最初的引号被丢弃了作为cmd%ComSpec% 转换的(可能是无意的)副作用。
【解决方案3】:
"C:\Windows\System32\cmd.exe /C"

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

你见过扩展名为.exe /c的文件吗?

正确的格式是:

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

【讨论】:

  • 如果是这样,任何想法 "cmd /C" "C:\\Program Files\ABC\xyz.exe" -register="abc" 为什么这样有效??
  • "cmd /c""cmd.exe" 有效,"cmd.exe /c" 无效。似乎使用不同的解析器。让我们等待我们的一位专家回答...
【解决方案4】:

关于为什么需要额外引号的附加问题:这在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

并且可执行文件可能会忽略其参数中缺少的右引号。

【讨论】:

  • 这里有很大的帮助。非常感谢。 :)
【解决方案5】:

看起来很奇怪:/

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

这行得通。不知道为什么。可能需要"C:\\Program Files\ABC\xyz.exe" -register="abc" 前后的双引号。希望有人能解释一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2013-01-31
    • 2012-02-13
    • 1970-01-01
    • 2018-12-28
    • 2019-06-30
    • 2020-06-15
    • 2021-02-26
    相关资源
    最近更新 更多