[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
与for无关,CMD解析命令行引号的机制造成的,应该是正常结果。

一和二运行的命令行分别是
C:\WINDOWS\system32\cmd.exe /c "c:\test\a a\a.exe"|"c:\test\a a\b.exe"
C:\WINDOWS\system32\cmd.exe /c "c:\test\a a\a.exe"

CMD处理引号的逻辑是:(参见cmd /?
1.   如果符合下列所有条件,那么在命令行上的引号字符将被保留:
- 不带 /S 命令行开关
- 整整两个引号字符
- 在两个引号字符之间没有特殊字符,特殊字符为下列中的一个: <>()@^|
- 在两个引号字符之间有至少一个空白字符
- 在两个引号字符之间有至少一个可执行文件的名称,且该文件存在(推测)

2.  否则,老办法是,看第一个字符是否是一个引号字符,如果是,舍去开头的字符并删除命令行上的最后一个引号字符,保留最后一个引号字符之后的文字。如果不是,所有的引号都保留(推测)

据此可知:
一中cmd.exe执行的命令是:c:\test\a a\c.exe"|"c:\test\a a\a.exe
二中,当a.exe存在时cmd.exe执行的是"c:\test\a a\a.exe",当a.exe不存在时cmd.exe执行的是c:\test\a a\a.exe

PS:个人认为,当初各种系统设计者允许空格作为文件名是一个很不理智的选择,这点也被大量由此导致的问题所凸显。
1

评分人数

    • plp626: 分析的可能也许好像有道理,重要的是让我加 ...PB + 20
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

注意,C:\WINDOWS\system32\cmd.exe /c "c:\test\a a\a.exe"|"c:\test\a a\b.exe"是由系统执行的,系统把整句作为命令调用,并不认为|是管道符,所有的字符都是普通字符,just a string / a char array。这句与我们直接敲入到CMD中运行是不一样的。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 9楼 的帖子

8楼的说明被你无视了吗?

C:\WINDOWS\system32\cmd.exe /c "c:\test\a a\a.exe"|"c:\test\b b\b.exe"
你把它放在开始→运行里面执行,与在CMD里面执行是不一样的。
在CMD里面要想达到同样效果也很简单,在|前面加个^即可。
在CMD中的命令先由CMD解析,再传递给系统。(这种东西在Linux就叫Shell)
CMD解析的结果是,把C:\WINDOWS\system32\cmd.exe /c "c:\test\a a\a.exe"交给系统执行(当然系统还是把它放在当前CMD中运行),把"c:\test\b b\b.exe"留给自己执行,并把前者的标准输出通过管道传递给后者。

在for中怎么写,你不是已经写了吗?不要把引号放在开头。(让CMD处理引号时不符合第一条逻辑即可)
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表