2016-05-04 7 views
2

Ich suchte nach einem Batch-Skript, das eine bestimmte und bekannte Zeile in einer anderen Batch-Datei bearbeitet. Ich fand diese Lösung (Stackoverflow: Batch - edit specified line in text file) und es war fast funktionierend. Das einzige Problem, das ich mit dem Skript von Endoro hatte, ist, dass es die Doppelpunkte am Anfang einer Zeile löscht, die ich nicht bearbeiten möchte. Gibt es eine Möglichkeit, dies zu vermeiden? Hilfe wäre sehr willkommen! Danke im Voraus!Batch - einzelne Zeile in Datei bearbeiten

@ECHO OFF &SETLOCAL 

:Input 
    set /p version=Please Enter Version: 


:Replacement 
    SET "file=test.bat" 
    SET /a Line#ToSearch=4 
    SET "Replacement=set jversion = %Version%_x86" 

(FOR /f "tokens=1*delims=: " %%a IN ('findstr /n "^" "%file%"') DO (
     SET "Line=%%b" 
     IF %%a equ %Line#ToSearch% SET "Line=%Replacement%" 
     SETLOCAL ENABLEDELAYEDEXPANSION 
     ECHO(!Line! 
     ENDLOCAL 
    ))>"%file%.new" 
TYPE "%file%.new" 
MOVE "%file%.new" "%file%" 

Antwort

0

for /F behandelt nachfolgende Trennzeichen als eins. findstr /N wird jeder Zeile eine Zeilennummer und ein Doppelpunkt vorangestellt. Wenn zum Beispiel die dritte Zeile :abcd ef ist, erhält for /F3::abcd ef. Nach dem Parsen der beiden Tokens erhalten Sie 3 und abcd ef. Deshalb verschwinden führende Doppelpunkte.

Um dies zu umgehen, verwenden Sie Sub-String-Ersetzungssyntax; vorausgesetzt, die Variable Line enthält die gesamte Zeile einschließlich der Zeilennummer Präfix (String 3::abcd ef von oben), verwenden Sie SET "Line=!Line:*:=!", um alles bis einschließlich den ersten Doppelpunkt zu entfernen (so die resultierende Zeichenfolge ist :abcd ef).

Um die Zeilennummer zu erhalten, verwenden Sie eine andere for /F Schleife mit : als Trennzeichen, holen nur das erste Token. Hier

ist die feste Skript:

@ECHO OFF &SETLOCAL 

:Input 
    set /p version=Please Enter Version: 


:Replacement 
    SET "file=test.bat" 
    SET /a Line#ToSearch=4 
    SET "Replacement=set jversion = %Version%_x86" 

(FOR /f "delims=" %%a IN ('findstr /n "^" "%file%"') DO (
     SET "Line=%%a" 
     rem // Use a `for /F` loop to extract the line number: 
     for /F "delims=:" %%N in ("%%a") do set "LNum=%%N" 
     SETLOCAL ENABLEDELAYEDEXPANSION 
     rem // Use sub-string replacement to split off 
     rem // the preceding line number and one colon: 
     SET "Line=!Line:*:=!" 
     IF !LNum! equ %Line#ToSearch% SET "Line=%Replacement%" 
     ECHO(!Line! 
     ENDLOCAL 
    ))>"%file%.new" 
TYPE "%file%.new" 
MOVE "%file%.new" "%file%" 
+0

Hallo aschipfl, vielen Dank für die schnelle Hilfe. Ich testete Ihre Anpassung und ich bemerkte, dass das Skript selbst jetzt nichts ändern wird (nicht einmal in Zeile 4 wie angenommen). Ich werde jedoch keine Fehlermeldungen erhalten und das Skript erstellt die ".new" -Datei (ich habe die letzte Zeile gelöscht). – Flos12

+0

Vielen Dank. Das Skript funktioniert jetzt wie ein Zauber :)! – Flos12