Как обрабатывать амперсанды при поиске / замене текста в командном файле? - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть следующий пакетный файл, чтобы найти и удалить строку в текстовом файле.Текстовые файлы будут иметь следующий формат:

079754,Billing & Business Adv..,E:\MyDirectory\079754_35931_Billing & Business Adv...pdf,Combined PDF

Я просто хочу удалить «E: \ MyDirectory \» из файла и затем переместить файл в подкаталог.Мой пакетный файл работает как положено, за исключением случая, когда в файле есть амперсанд (такой как приведенный выше) ..

Вместо моего файла результатов, содержащего:

079754,Billing & Business Adv..,Billing & Business Adv...pdf,Combined PDF

Itвместо этого содержит

079754,Billing 

Я немного новичок в написании командных файлов и знаю, что амперсанд так или иначе влияет на токенизацию.Любая помощь будет принята с благодарностью!

Пакетный файл:

@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

1 Ответ

5 голосов
/ 21 апреля 2011

Вы должны ставить в кавычки такие команды, как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...