
echo最佳用法考最后由 CrLf 于 -8-3 19:12運行測試代碼(需要 ascmap.cmd 函數文件:http://bbs.bathome.net/thread-12347-1-1.html):
測得 echo 可用參數分隔符如下(格式:[字符]=[ASC]):nclick="copycode($('code0'));">復制代碼
- @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
以下為一些測試結論:1、echo 后跟空格的用法通用性最差,不兼容空行或僅含空格的行、不能直接顯示 /?、on 和 off:nclick="copycode($('code1'));">復制代碼
- =32
- (=40
- +=43
- ,=44
- .=46
- /=47
- :=58
- ;=59
- ==61
- [=91
- =92
- ]=93
2、而 ; , = 同屬于 cmd 中的默認分隔符,雖然是對空格的改進,卻仍無法顯示 /?:nclick="copycode($('code2'));">復制代碼
- echo
- echo /?
- echo on
- echo off
3、echo 后跟 .、:、、+、[ 或 ] 時,能將參數理解為消息,但是會觸發對文件的搜索,所以效率會降低(參考:http://bbs.bathome.net/redirect. ... 2&fromuid=30406與:http://bbs.bathome.net/redirect.php?tid=18352),并有可能打開路徑相吻合的文件nclick="copycode($('code3'));">復制代碼
- echo;/?
- echo,/?
- echo=/?
4、如此排除,就只剩下了 (,經測試,其各方面兼容性均達標,唯一的遺憾大概就是會影響器中的括號匹配:nclick="copycode($('code4'));">復制代碼
- @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
- )
結論:以后還是用 echo( 好了,丑是丑了點,勝在通用性。附原第 4 點:------------------------------------------------------------------------------------------------------------------4、echo 后跟 .、:、、+、[ 或 ] 時會十分離奇地在特定情況下(比如參數中無空格)禁用對延遲變量中的變量替換進行解釋:nclick="copycode($('code5'));">復制代碼
- setlocal enabledelayedexpansion
- echo(
- echo(/?
- echo(on
- echo(off
- echo(!tmp:=!
------------------------------------------------------------------------------------------------------------------本貼 3樓 demon 猜測這其實是命令被優先理解為路徑導致的,經證實確實如此,解決方法是轉義 ! 號對中的默認分隔符:nclick="copycode($('code6'));">復制代碼
- setlocal enabledelayedexpansion
- echo.!tmp:=!
- echo:!tmp:=!
- echo!tmp:=!
- echo+!tmp:=!
- echo[!tmp:=!
- echo]!tmp:=!
與第3點本質上有所重復,故從正文中移除。nclick="copycode($('code7'));">復制代碼
- echo!tmp:^=!

