5

我的第一篇文章,大多数问题已经使用这里提供的友好知识解决了。但是现在我的想法已经用完了,又是一个关于在 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 对干净解决方案的回答。

谢谢你的帮助,马丁

4

1 回答 1

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

于 2013-02-05T23:36:58.123 回答