逃逸百分比符号给定变量

时间:2013-02-05 22:59:18

标签: windows batch-file escaping cmd

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

假设有一个用双引号括起来的给定字符串变量。大多数毒药角色之前已经被常见的字符替换,左边的那些扰乱脚本的是“&”,“(”,“)”和“%”。之后,字符串必须回显到没有引号的文件。所以我有想法逃脱毒性三倍:

@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

当我在上面调用我的脚本时,我得到了预期的输出 - 除了缺少百分号:

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>

我知道百分比可以自行逃脱。所以“%%”通常会导致单个文字“%”。但是我找不到百分号的工作替换程序是不可能的,因为cmd总是将其解释为变量并尝试扩展它。这是处理这个问题的完全错误的方向还是只是对变量扩展的误解?任何提示都欢迎!谢谢!

干杯,马丁

修改 删除了自己的代码,见下面Jeb对清洁解决方案的回答。

感谢您的帮助,马丁

1 个答案:

答案 0 :(得分:6)

好问题!
首先,是的,你可以更换百分号,但不是百分比扩展,你需要在这里延迟扩展。

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的惊叹号 之后,您应该切换到延迟扩展并在任何地方使用它。