[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 6# forfiles


    见 4 楼观点:
括号的错误匹配一向是发生在 ) 的多余和缺失上,与 ( 无关

TOP

不懂帮顶
当需要用一个BAT动态生成另外一个BAT的时候,估计echo(比较纠结。

TOP

本帖最后由 CrLf 于 2012-8-3 21:39 编辑

回复 5# Demon


    貌似我这帖子没有说过 echo. 具有通用性,只说过 echo( 在同条件下是十二种方案中通用性最强的一种,所以个人认为这是 echo 的最佳用法。
  那个转义的例子只是为了说明使用时可以将特殊字符转义避免错误解析,稍作引申罢了,若按老兄的角度来无限放大通用性的范围,那没有任何一种办法能在不转义的情况下 echo &、| 等 特殊字符,也没有办法 echo 超过 8187 字符(8192-5)长度的字符串了

TOP

本帖最后由 CrLf 于 2012-8-3 17:32 编辑

回复 3# Demon


    老兄对第 4 点的解释确实很有道理,恍然大悟,实际原因大约就在于此,这和 echo.bat 的原因一致:
  1. echo.bat
  2. ::先对文件名进行匹配,找不到时再以 echo 命令解读
  3. echo pause>echo.bat
  4. echo.bat
  5. ::由于找到了相应的文件,所以执行的是 echo.bat 而非 echo 命令
  6. echo test
  7. ::虽然 bat 可以只靠文件名来调用,但是内部命令例外
复制代码
括号的错误匹配一向是发生在 ) 的多余和缺失上,与 ( 无关,所以括号对中的 echo((1+2)*3=9 只要改成 echo((1+2^)*3=9 就能正确运行了,所以并非 "echo( 通用性最强" 的反例。

另外,不知为何在同样需要搜索文件的前提下,+、[、] 的效率要远高于 .、:、\,反而与 "echo " 接近?
莫非  .、:、\ 效率低下的原因并不是对文件匹配?
测试代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (" " . : \ + [ ]) do (
  3.         (set timea=!time!
  4.         for /l %%b in (1 1 10000) do echo%%~a
  5.         call :时差 !timea! !time!)>nul
  6.         echo 运行 10000 次 echo%%~a 的用时为: !时差!
  7. )
  8. pause
  9. :时差
  10. for /f "tokens=1-8 delims=:. " %%a in ("%*") do (
  11.         set /a "时差=(((%%e-%%a)*60+1%%f-1%%b)*60+1%%g-1%%c)*100+1%%h-1%%d"
  12. )
复制代码

TOP

本帖最后由 Demon 于 2012-8-3 16:57 编辑
  1. for /l %%i in (1 1 1) do (
  2.     echo((1+2)*3=9
  3.     echo(round bracket is best?
  4.     echo(I don't think so.
  5. )
复制代码
http://demon.tw/reverse/cmd-internal-parser.html

http://demon.tw/reverse/cmd-internal-echo.html

简单说几句吧,除了空格" "、等号"="、逗号","、分号";"以及你给出的左括号"("外,其他符号都会对文件进行搜索。

至于你提到的第4点,也没什么离奇的,不要忘了等号"="在一般情况下也是分隔符,
  1. echo+!tmp:\=!
复制代码
CMD在解析(Parse)时会将等号前面的echo+!tmp:\当成命令,而后面的=!当成命令的参数。

显然echo+!tmp:\并不是有效的内部命令,这时CMD会当成外部命令进行文件搜索(效率降低),然而依然无法找到,这时会对命令进行修复(Fix)。

但是如果ENABLEDELAYEDEXPANSION的话,变量延迟拓展是在命令修复之前进行的,CMD会分别对echo+!tmp:\命令和它的参数=!进行变量延迟拓展,

很显然得到的命令是echo+tmp:\,参数是=,修复后的命令是echo,参数是+tmp:\=,最后echo的输出是tmp:\=

结合上面的情况来看,echo并不存在所谓的最佳用法,需要根据具体情况选择,我的建议是一般情况下使用逗号","(出于效率),在需要输出/?开头的字符串时使用加号"+"。

TOP

版主研究很深,小弟还没有体验到这个深度

TOP

返回列表