本帖最后由 cjiabing 于 2011-10-8 00:02 编辑
回复 60# batman
哈哈,当时犯糊涂了,现在看都好笑。
另外,谈谈对FOR /F 选项的一些经历:
记得前阵子看过类似这个
- for /f tokens^=1*^ delims^=^" %%a in ("sd"z"vc") do echo %%b
复制代码
当时我也犯糊涂了,怎么FOR的tokens的=号前还要转义符呢?但我很快想到,在cmd中,特别是cmd的嵌套中,注意,这个cmd是指在批处理文件里的命令 cmd /q 里的FOR的等号也是需要转义的。如:
- for /f "tokens=1*" %%i in ('cmd /v:on /c "@echo off&for /f "usebackq tokens^=*" %%a in ("%1") do (echo ^!random^! %%a)"^|sort') do echo %%j
复制代码
在这里,第二个FOR必须用转义符,一般在FOR内部保留处理默认分隔符时,一般都需要特殊处理,如:
- C:\>for %a in (=) do echo %a
- C:\>
- C:\>for /f %a in ("=") do echo %a
- C:\>echo =
- =
复制代码
如果把外面的FOR去掉,以及把所有转义符去掉,这样也可以:
- cmd /v:on /c "@echo off&for /f "usebackq tokens=*" %%a in ("%1") do (echo !random! %%a)"|sort
复制代码
- cmd /v:on /c "@echo off&for /f "usebackq tokens^=*" %%a in ("%1") do (echo ^!random^! %%a)"|sort
复制代码
如果不去掉FOR里面的转义符也可以,但“|sort”这个前面的转义符要去掉。那么这里就有一个问题了,为什么这里用不用转义符都一样?难道转义符失灵了?
通过以上大家可以对FOR命令里的符号有了更多的认识。
plp626的代码,- for /f tokens^=1*^ delims^=^" %%a in ("sd"z"vc") do echo %%b
复制代码
在命令提示符窗口也可以执行,但如果去掉tokens=后(转义空格)与delims=(转义双引号)前的等号的转义符,命令就会提示“此时不应有 1* delims。”
可见,在这里,必须用转义符,否则命令失效。但你想起一个问题没有,FOR命令语法的参数是要用双引号引住的!
- FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
复制代码
看看,这里["options"] 是要用引号的。而楼主的代码没有使用引号。delims后面的一个双引号被转义成分隔符来使用了。因为在命令中,引号一般都是成对出现的,少一个往往会引起错误,而这里没有,证明被转义了。如果你在tokens^=1*^ delims^=^"外面添加一对双引号,命令就会出现语法错误。而如果你把转义符全部去掉,直接“delims="”,这样是会出错的,因为双引号不能作为转义符。
就像powerbat 所做的测试,在FOR /F后面的选项中,使用双引号与否、使用的位置、数量等都会影响到命令的执行,我也曾经做过这类的试验。比如这样的“for /f "tokens=2" "delims=。" %%a in……结果只有一个运行得了。
从这些问题上看,这些参数的变化正反应出FOR的运行规律。 |