在给定的variables中跳出百分号

我的第一篇文章,大多数问题已经解决了这个友好提供知识在这里。 但是现在我用完了一个关于在cmd.exe中处理有毒字符的问题。

假设在双引号中包含给定的stringvariables。 大部分毒物字符已经被普通字符replace,左边的字符是“&”,“(”,“)”和“%”。 之后,该string必须回显到不带引号的文件中。 所以我有这个想法逃避毒药人物的三倍:

@echo off & setlocal ENABLEEXTENSIONS SET AlbumArtist=%1 CALL :EscapePoisonChars %AlbumArtist% AlbumArtist_VDN SET "FlacHyperLink==hyperlink^("file://%AlbumArtist_VDN%"^;"LossLess"^)") echo %FlacHyperLink% 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 

当我打电话给我的脚本上面,我得到了预期的输出 – 除了缺less的百分号:

 G:\YAET\20130204_Work>TryAmper.bat "100% Rock & Roll (7' UpMix)" =hyperlink("file://100 Rock & Roll (7' UpMix)";"LossLess") 100 Rock & Roll (7' UpMix) G:\YAET\20130204_Work> 

我知道百分比本身可以逃脱。 所以“%%”通常会导致一个单一的文字“%”。 但是我不可能find百分号的replace程序,因为cmd总是将它解释为一个variables,并试图扩展它。 这是完全错误的方向来处理这个问题,或只是误解variables扩展? 任何提示欢迎! 谢谢!

干杯,马丁

编辑删除自己的代码,请参阅下面杰布的答案干净的解决scheme。

马丁,谢谢你的帮助

Solutions Collecting From Web of "在给定的variables中跳出百分号"

很好的问题!
首先,是的,你可以替换百分号,但不是百分之一的扩展,你需要在这里延期扩张。

 Setlocal EnableDelayedExpansion set tmpstr=!tmpstr:%=%%! 

但是,如果使用延迟扩展,则不再需要转义,因为延迟扩展是批解析器的最后一个阶段,所有字符都没有任何特殊含义。
你只需要回声延迟扩展。

 Echo !tmpvar! 

编辑:清洁的解决方案

 @echo off setlocal DisableDelayedExpansion REM * More or less secure getting the parameter SET "AlbumArtist=%~1" setlocal EnableDelayedExpansion SET "FlacHyperLink==hyperlink("file://!AlbumArtist!";"LossLess")" echo !FlacHyperLink! echo !FlacHyperLink!> hugo.txt 

你首先需要disableDelayedExpansion,甚至可以从%1得到感叹号。
之后,您应该切换到延迟扩展,并在任何地方使用。