我的第一篇文章,大多数问题已经使用此处提供的友好知识解决了。但是,现在我用尽了所有想法,再次提出了有关在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答案以获得干净的解决方案。
谢谢你的帮助,马丁
最佳答案
好问题!
首先,是的,您甚至可以替换百分号,但不能在百分号内进行扩展,因此需要在此处延迟扩展。
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
中获得感叹号。之后,您应该切换到延迟扩展并在任何地方使用它。
关于windows - 给定变量中的转义百分号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14718591/