这个问题最初来自Escape percent sign in given variables。我不想打乱那边的好答案。但是我的问题发生了一点变化......
假设有一个用双引号括起来的给定字符串变量,其中可能包含一个或多个百分号。无法永久切换到启用的延迟扩展(其他代码已经可用)。调用包含字符串变量作为参数的函数是必要的。这是我到目前为止确定的:
@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 技术。谢谢!