我的第一篇文章,大多数问题已经使用这里友好提供的知识解决了.但是现在我的想法已经用完了,还有一个关于在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
Run Code Online (Sandbox Code Playgroud)
当我在上面调用我的脚本时,我得到了预期的输出 - 除了缺少百分号:
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>
Run Code Online (Sandbox Code Playgroud)
我知道这个百分比可以自己逃脱.所以"%%"通常会导致单个文字"%".但是我找不到百分号的工作替换程序是不可能的,因为cmd总是将它解释为变量并尝试扩展它.这是处理这个问题的完全错误的方向还是只是对变量扩展的误解?任何提示都欢迎!谢谢!
干杯,马丁
编辑 删除自己的代码,见下面Jeb对清洁解决方案的回答.
谢谢你的帮助,马丁
我真的想知道为什么我的字符串替换过程在解析包含任何特殊字符(包括感叹号)的文本文件时有效.我预计延迟变量扩展会关闭&符号,百分号等的特殊含义,但会因感叹号而失败...
码:
@echo on & setlocal ENABLEEXTENSIONS
set "InFile=%~1"
set "OutFile=%~2"
set "Replace=%~3"
CALL :ParseCue "%%InFile%%" "%%OutFile%%" "%%Replace%%"
endlocal &GOTO:EOF
:ParseCue
@echo on & setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
set "FileToParse=%~1"
set "OutputFile=%~2"
set "NewExtension=%~3"
for /F "usebackq tokens=* delims=" %%a in ("%FileToParse%") DO (
set "line=%%a"
@echo on & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set "line=!line:.wav=%NewExtension%!"
echo(!line!>>"%OutputFile%"
endlocal
)
endlocal &GOTO:EOF
Run Code Online (Sandbox Code Playgroud)
InputFile.txt:
This a test for parsing lines with special characters
Rock & Roll.wav
Rock & Roll!.wav
Special | < > ~ \ …Run Code Online (Sandbox Code Playgroud) 对于包含感叹号的文件夹名称,以下代码失败.我想我需要启用DelayedExpansion来处理嵌套的for循环.任何想法让这项工作?谢谢!
@echo off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set "dest=%~dpn1"
IF "%1" equ "" Set "dest=%cd%"
set /a Folders=0
set /a FoldersWithSubFoldersAndFiles=0
set /a FoldersWithOnlyFiles=0
set /a FoldersWithOnlySubFolders=0
set /a FoldersEmpty=0
for /f "usebackq tokens=*" %%a in (`DIR /AD /S /B "%dest%"`) do (
Set /a Folders+=1
for /f "usebackq tokens=*" %%i in (`DIR "%%a" /A-D /B 2^>NUL^| FIND /C /V ""`) do (
Set NumberOfFiles=%%i
)
for /f "usebackq tokens=*" %%i in (`DIR "%%a" /AD /B 2^>NUL^| FIND /C /V …Run Code Online (Sandbox Code Playgroud)