在批处理文件中查找/替换文本时如何处理&符号?

nts*_*sue 2 windows batch-file

我有以下批处理文件来查找和删除文本文件中的字符串.文本文件将采用以下格式:

079754,Billing & Business Adv..,E:\MyDirectory\079754_35931_Billing & Business Adv...pdf,Combined PDF
Run Code Online (Sandbox Code Playgroud)

我只想从文件中删除"E:\ MyDirectory \",然后将文件移动到子目录.我的批处理文件按预期工作,除了文件中有一个&符号(例如上面的一个)之外.

而不是我的结果文件包含:

079754,Billing & Business Adv..,Billing & Business Adv...pdf,Combined PDF
Run Code Online (Sandbox Code Playgroud)

它包含,

079754,Billing 
Run Code Online (Sandbox Code Playgroud)

我对编写批处理文件有些新意,我知道&符号会以某种方式影响标记化.任何帮助将不胜感激!

批处理文件:

@echo off
cd C:\Temp\broker
for %%f in (*.dat) do (
    if exist newfile.txt del newfile.txt
    FOR /F "tokens=* delims=" %%a in (%%f) do @call :Change "%%a"
    del %%f
    rename newfile.txt %%f
    move %%f "import\%%f"
)

exit /b
pause

:Change
set Text=%~1
set Text=%Text:E:\MyDirectory\=%

FOR /F "tokens=3 delims=," %%d in ("%Text%") do @set File=%%d
(echo %Text%)>> newfile.txt
move "%File%" "import\%File%"
exit /b
Run Code Online (Sandbox Code Playgroud)

jeb*_*jeb 5

您应该引用命令,例如set,以逃避&和其他特殊字符.
并使用延迟扩展,与延迟扩展一样,忽略特殊字符.
并且在执行块之前评估百分比扩展,因此您的for循环无法按预期工作.

setlocal EnableDelayedExpansion
...

:Change
set "Text=%~1"
set "Text=!Text:E:\MyDirectory\=!"

FOR /F "tokens=3 delims=," %%d in ("!Text!") do @set File=%%d
(echo !Text!)>> newfile.txt
move "!File!" "import\!File!"
exit /b
Run Code Online (Sandbox Code Playgroud)