本帖最后由 CrLf 于 2012-8-3 19:12 编辑
运行测试代码(需要 ascmap.cmd 函数文件:http://bbs.bathome.net/thread-12347-1-1.html):- @echo off
- setlocal enabledelayedexpansion
- call ascmap $
- cd .>enable.txt
- for /l %%a in (0x20 1 0x7f) do (
- echo "!$:~%%a,1!"
- %comspec% /v:off /c "echo!$:~%%a,1! test" 2>nul|findstr " test" &&echo %%a=%%a>>enable.txt
- )
- pause
复制代码 测得 echo 可用参数分隔符如下(格式:"[字符]"=[ASC]):- " "=32
- "("=40
- "+"=43
- ","=44
- "."=46
- "/"=47
- ":"=58
- ";"=59
- "="=61
- "["=91
- "\"=92
- "]"=93
复制代码 以下为一些测试结论:
1、echo 后跟空格的用法通用性最差,不兼容空行或仅含空格的行、不能直接显示 /?、on 和 off:- echo
- echo /?
- echo on
- echo off
复制代码 2、而 ; , = 同属于 cmd 中的默认分隔符,虽然是对空格的改进,却仍无法显示 /?:复制代码 3、echo 后跟 .、:、\、+、[ 或 ] 时,能将参数理解为消息,但是会触发对文件的搜索,所以效率会降低
(参考:http://bbs.bathome.net/redirect. ... 2&fromuid=30406
与:http://bbs.bathome.net/redirect.php?tid=18352),并有可能打开路径相吻合的文件- @echo off&setlocal enabledelayedexpansion
- for %%a in (";" . : \) do (
- (set timea=!time!
- for /l %%b in (1 1 10000) do echo%%~a
- call :时差 !timea! !time!)>nul
- echo 运行 10000 次 echo%%~a 的用时为: !时差!
- )
- pause
-
- :时差
- for /f "tokens=1-8 delims=:. " %%a in ("%*") do (
- set /a "时差=(((%%e-%%a)*60+1%%f-1%%b)*60+1%%g-1%%c)*100+1%%h-1%%d"
- )
复制代码 4、如此排除,就只剩下了 (,经测试,其各方面兼容性均达标,唯一的遗憾大概就是会影响编辑器中的括号匹配:- setlocal enabledelayedexpansion
- echo(
- echo(/?
- echo(on
- echo(off
- echo(!tmp:\=!
复制代码 结论:以后还是用 echo( 好了,丑是丑了点,胜在通用性。
附原第 4 点:
------------------------------------------------------------------------------------------------------------------
4、echo 后跟 .、:、\、+、[ 或 ] 时会十分离奇地在特定情况下(比如参数中无空格)禁用对延迟变量中的变量替换进行解释:- setlocal enabledelayedexpansion
- echo.!tmp:\=!
- echo:!tmp:\=!
- echo\!tmp:\=!
- echo+!tmp:\=!
- echo[!tmp:\=!
- echo]!tmp:\=!
复制代码 ------------------------------------------------------------------------------------------------------------------
本贴 3楼 demon 猜测这其实是命令被优先理解为路径导致的,经证实确实如此,解决方法是转义 ! 号对中的默认分隔符:复制代码 与第3点本质上有所重复,故从正文中移除。 |