windows - Hvordan håndtere ampersands når man finder/erstatter tekst i batchfil?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har følgende batchfil for at finde og fjerne en streng i en tekstfil. Tekstfilerne kommer i følgende format:


079754,Billing & Business Adv..,E:MyDirectory79754\_35931\_Billing & Business Adv...pdf,Combined PDF


Jeg vil blot fjerne 'E: \ MyDirectory \' fra filen og derefter flytte filen til en undermappe. Min batch-fil fungerer som forventet bortset fra det tilfælde, hvor der er en ampersand i filen (som den ovenfor).


I stedet for min resultatfil indeholdende:


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


Det indeholder i stedet,


079754,Billing 


Jeg er noget nyt til at skrive batch-filer, og jeg ved, at ampersand påvirker tokeniseringen på en eller anden måde. Enhver hjælp ville blive meget værdsat!


Batch-fil:


@echo off
cd C:Temproker
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

Bedste reference


Du bør enquote kommandoer som set for at undslippe & og andre specialtegn.

Og brug den forsinkede ekspansion, som med forsinket ekspansion ignoreres specialtegnene.

Og procentudvidelse evalueres, før en blok udføres, så din for-loop kan ikke fungere som forventet.


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