windows - Batch Slet en linje i en tekstfil?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg trækker mit hår ud og finder et simpelt eksempel på en DOS-batchfil, der vil slette den første linje i flere tusinde txt-filer og gemme filen med det oprindelige filnavn. Efter en batchproces udført af et andet program skal jeg derefter ADD den slettede linje (en tekststreng bestående af 'X, Y, Z') i starten af ​​hver fil efter den eksterne behandling.

Bedste reference


Du kan bruge more +1 til at springe over den første linje i filen. Derefter kan du røre det til en midlertidig (du kan ikke redigere tekstfiler på plads):


for \%x in (*.txt) do (more +1 "\%x">tmp & move /y tmp "\%x")


Derefter kan du bruge en lignende teknik til at tilføje den første linje igen:


for \%x in (*.txt) do ((echo X,Y,Z& type "\%x")>tmp & move /y tmp "\%x")


Hvis du bruger dem i en batchfil, skal du huske at fordoble \% tegnene:


@echo off
for \%\%x in (*.txt) do (
    more +1 "\%\%x" >tmp
    move /y tmp "\%\%x"
)
rem Run your utility here
for \%\%x in (*.txt) do (
    echo X,Y,Z>tmp
    type "\%\%x" >>tmp
    move /y tmp "\%\%x"
)


Ok, tilsyneladende more virker ikke med for store filer, hvilket overrasker mig. Som et alternativ, som skal fungere, hvis din fil ikke indeholder tomme linjer (selv om det ligner CSV fra det jeg samlet):


for \%\%x in (*.txt) do (
    for /f "skip=1 delims=" \%\%l in ("\%\%x") do (>>tmp echo.\%\%l)
    move /y tmp "\%\%x"
)

Andre referencer 1


Her er min version.


@echo off

for /f "usebackq delims=" \%\%f in (`dir /b *.txt`) do (
    echo X, Y, Z>"tmp.txt"
    type "\%\%f" >> tmp.txt
    move tmp.txt "\%\%f"
)