回复 Demon
老兄对第 4 点的解释确实很有道理,恍然大悟,实际原因大约就在于此,这和 echo.bat ...
CrLf 发表于 2012-8-3 17:13 
更正一下《批处理技术内幕:ECHO命令》的错误,
由于当时没有分析文件搜索的CALL(太复杂懒得跟踪),错误的认为它们的搜索过程都是一样的,在简单分析了一下分析文件搜索的过程之后,发现并不是如此,
虽然+/[]:.\都会调用文件搜索的CALL,如果命令中存在冒号:或者反斜杆\,处理的方法与不存在时是不一样的。
另外,在搜索开始之前斜杆/(即Unix路径分隔符)会被替换成反斜杠\,故斜杆和反斜杆效果是一样的。
具体的处理过程比较复杂,就不展开了,具体到echo而言,echo/ echo: echo\都不会进行实际的文件搜索,只是会调用一些无关痛痒的函数,对效率的影响基本是可以忽略的。
而echo+ echo[ echo] echo.会对工作目录与%PATH%中的目录进行搜索,速度自然会比较慢。
但是用你给出的测试代码测试出来的结果似乎并不符合上面的结论,原因不明,我用的是下面的测试代码:- Set fso = CreateObject("scripting.filesystemobject")
- set WshShell = CreateObject("wscript.Shell")
-
- s = "(=,;/\:+[]."
-
- For i = 1 To Len(s)
- c = Mid(s, i, 1)
- h = Hex(Asc(c))
-
- With fso.OpenTextFile(h & ".bat", 2, True)
- .WriteLine "@echo off"
- .WriteLine "set s=%time%"
- For j = 1 To 100
- .WriteLine "echo" & c & ">nul"
- Next
- .WriteLine "set e=%time%"
- .Write "echo echo" & c & " %s% %e%>" & h & ".txt"
- End With
-
- WshShell.Run h & ".bat", 0, True
-
- With fso.OpenTextFile(h & ".txt")
- a = Split(.ReadLine, " ")
- End With
-
- WScript.Echo a(0), TimeDiff(a(1), a(2))
-
- fso.DeleteFile h & ".bat"
- fso.DeleteFile h & ".txt"
- Next
-
- Function TimeDiff(s, e)
- t = DateDiff("s", CDate(Left(s, 8)), CDate(Left(e, 8)))
- t = t * 1000 + (Right(e, 2) - Right(s, 2)) * 10
- TimeDiff = t
- End Function
复制代码
|