網路上最佳解法, 據聞為 Mark Tattersall 的點子, 頗具創意, 藉 find 指令錯誤訊息之特性, 很妙的小技巧, 但 lowercase 就沒這類的捷徑了。
:UPPERCASE
for /F "tokens=2 delims=-" %%i in ('find "" "%~1" 2^>^&1') do set "r=%%i"
set "r=%r:~1%"
exit /b
r = returned uppercase stringfor /F "tokens=2 delims=-" %%i in ('find "" "%~1" 2^>^&1') do set "r=%%i"
set "r=%r:~1%"
exit /b
看似便捷的方案, 隱含兩項限制:
1. 不得存在相同字串的檔案, 否則非但無錯誤輸出, 反倒會去處理該檔之內容。
2. 字串不得含減號, 不然會被視為分隔字元, 無法取得完整字串。
為免除上述限制, 可在字串前加上檔名所不允許之特殊字元"冒號", 且不使用 for 粹取字串。
1. 不得存在相同字串的檔案, 否則非但無錯誤輸出, 反倒會去處理該檔之內容。
2. 字串不得含減號, 不然會被視為分隔字元, 無法取得完整字串。
為免除上述限制, 可在字串前加上檔名所不允許之特殊字元"冒號", 且不使用 for 粹取字串。
:UPPERCASE
for /F "tokens=*" %%i in ('find "" ":%~1" 2^>^&1') do set "r=%%i"
:UPC1
if not "%r:~0,1%" == ":" set "r=%r:~1%"& goto :UPC1
set "r=%r:~1%"
exit /b
r = returned uppercase stringfor /F "tokens=*" %%i in ('find "" ":%~1" 2^>^&1') do set "r=%%i"
:UPC1
if not "%r:~0,1%" == ":" set "r=%r:~1%"& goto :UPC1
set "r=%r:~1%"
exit /b
粹取字串的另一個方法是: 直接將不要的訊息移除, 利用字串取代可輕易為之。
:UPPERCASE
for /F "tokens=*" %%i in ('find "" ":%~1" 2^>^&1') do set "r=%%i"
for /F "tokens=*" %%i in ('find "" "" 2^>^&1') do set "e=%%i"
call set "r=%%r:%e%:=%%"
exit /b
r = returned uppercase stringfor /F "tokens=*" %%i in ('find "" ":%~1" 2^>^&1') do set "r=%%i"
for /F "tokens=*" %%i in ('find "" "" 2^>^&1') do set "e=%%i"
call set "r=%%r:%e%:=%%"
exit /b