cmd.exe
)具有可选的/s
参数,它修改了/c
(运行特定命令,然后退出)或/k
(运行特定命令,然后显示shell提示符)的行为。这个/s
参数显然与某些古怪的引号处理有关。
文档很令人困惑,但据我所知,当您执行cmd /c
something
,并且something
包含引号时,默认情况下cmd
有时会剥离这些引号,而/s
告诉它保留它们。我不理解的是什么情况下去掉引号会导致错误,因为这是唯一需要使用“/s”(“抑制默认的引号去除行为”)的时候。它仅在某些神秘条件下去除引号,其中之一是在“/c”后的第一个字符必须是引号。因此,它不会删除参数周围的引号;它要么删除您正在运行的EXE文件的路径周围的引号,要么删除整个命令行周围的引号(或可能在命令行的前半部分周围的引号,这将很奇怪)。
- 如果EXE文件的路径已经被引用,例如
cmd /c "c:\tools\foo.exe" arg1 arg2
,则引号是不必要的,如果cmd
想要删除它们,那就没问题了。(如果路径中有空格,则不会删除它们——这是另一条晦涩的规则。)我无法想象有任何理由来压制引号的移除,因此/s
似乎是不必要的。 - 如果整个命令行都被引用,例如
cmd /c "foo.exe arg1 arg2"
,那么引号的移除似乎是必要的,因为系统上没有名为foo.exe arg1 arg2
的EXE文件;因此使用/s
退出引号移除似乎会导致问题出现。(实际上,它确实不会出问题:cmd /s /c "foo.exe arg1 arg2"
可以正常工作。)
/s
是否有什么微妙之处我没有理解?它什么时候是必要的?它什么时候会有所区别呢?
/s
如何工作的描述是不正确的。然而,没有任何得到赞同的答案似乎能够纠正你的描述,所以我不确定该怎么想。 - cowlinatorWindows 7 x64
中,它的工作方式就像始终使用/s
一样。 - Andry@
作为命令启动字符,以避免引号去除:cmd.exe /c @"..." ...
- Andry