この質問はもともと、指定された変数のパーセント記号のエスケープから来ています。あちらの良い答えを混乱させたくありません。しかし、私の問題は少し変わりました...
1 つ以上のパーセント記号を含む可能性がある二重引用符で囲まれた特定の文字列変数があると仮定しましょう。有効な遅延展開に永続的に切り替えることはできません (他のコードは既に使用可能です)。文字列変数をパラメータとして含む関数を呼び出す必要があります。これは私がこれまでに決定したものです:
@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 テクニックをさらに改善するのに役立ちます。ありがとう!