此問題最初來自Escape percent signs in given variables。我不想在那邊解散好的答案。但我的問題改變了一點點...當通過CALL時百分號消失
讓我們假設有一個給定的字符串變量用雙引號引起來,它可能包含一個或多個百分比符號。無法切換到啓用延遲擴展(其他代碼已可用)。調用包含字符串變量作爲參數的函數是必要的。這是我到目前爲止確定的:
@echo off & setlocal ENABLEEXTENSIONS
SET AlbumArtist=%1
CALL :EscapePoisonChars %AlbumArtist% AlbumArtist_VDN
echo %AlbumArtist_VDN%
CALL :EscapePoisonChars %%AlbumArtist%% AlbumArtist_VDN
echo %AlbumArtist_VDN%
endlocal &GOTO:EOF
:EscapePoisonChars
@echo off & setlocal ENABLEEXTENSIONS
SET TmpString="%~1"
SET TmpString=%TmpString:&=^^^&%
SET TmpString=%TmpString:(=^^^(%
SET TmpString=%TmpString:)=^^^)%
endlocal&SET %2=%TmpString:~1,-1%&GOTO :EOF
我知道這可能不是一個「乾淨的解決方案」。但我想知道爲什麼當例程被CALL :EscapePoisonChars %AlbumArtist% AlbumArtist_VDN
調用時百分號消失。當與字符串變量%%AlbumArtist%%
稱爲封閉的一倍百分號它提供了所需的輸出:
D:\Batch>PercentTwins.bat "100% Rock & Roll"
100 Rock & Roll
100% Rock & Roll
D:\Batch>
爲何會有不同的結果,如果%AlbumArtist%擴大輸入或功能:EscapePoisonChars
外面?隨着回聲我看到百分號只是消失SET TmpString="~1"
。任何解釋都會幫助我改進我的更進一步的CMD技術。謝謝!
5分鐘達到上限:-)現在我看到你所提到的微軟知識庫和它說,一個百分號將被解釋爲一個NUL CHARAC當由回聲處理時。通過嘗試,我發現當字符串用雙引號括起來時,單個百分號也會被回顯。現在我通過CALL解析雙引號字符串,並且行爲完全改變。奇怪。馬丁 – CmdQuestion 2013-02-08 17:12:09