Batch Zeilen in einen Textdatei austauschen ???... Script stürzt manchmal ab.
Servus Leute,
mein Skript geht nicht richtig ;-(
Mein Script soll Zeilen tauschen wenn ein Suchstring in der Zeile gefunden wird !,
es funktioniert auch soweit bis ich in der Textdatei Zeichen wie diese drin habe: %&/()=?'*"§$%&/ usw.
auch Zeilen wo nur Blanks drin sind, bringen das Script zum absturz ???
wer kann mir helfen
DANKE...
Vipy
Habe jetzt einen Zwischenlösung die halbwegs funktioniert....
aber bei zeichen wie !"§$%&/()=?`*'+#ß`*#+`ß0 in Datei hängt sich das Script auf
es liegt an der
Zeile: FOR /f "delims=" %%i IN ('FINDSTR /N $ "%QuellDatei%"') DO ABSTURTZ BEI ZEICHEN WIE !"§$%&/()=??'*`?= usw.
Zeile: FOR /f "delims=" %%i IN ('FINDSTR . "%QuellDatei%"') DO übergibt KEINE LEERZEILEN
FRAGE: was ist da Falsch ???
DANKE FÜR EURE HILFE....
mein Skript geht nicht richtig ;-(
Mein Script soll Zeilen tauschen wenn ein Suchstring in der Zeile gefunden wird !,
es funktioniert auch soweit bis ich in der Textdatei Zeichen wie diese drin habe: %&/()=?'*"§$%&/ usw.
auch Zeilen wo nur Blanks drin sind, bringen das Script zum absturz ???
wer kann mir helfen
DANKE...
Vipy
:: SCRIPT BY: VIPY (Nov 2013) ------------------------------
:: SCRIPT ERSETZT ZEILEN WENN DER SUCHSTRING IN ZEILE GEFUNDEN WURDE! SUCHE ZEILEN MIT SUCHSTRING "SeachStr"
:: IN DATEI "QuellDatei" UND ERSETZT DIE KOMPLETTE ZEILE MIT "ReplaceStr" SCHREIBT DABEI EINEN NEUE DATEI "ZielDatei"
:: DIESES SCRIPT SCHREIBT AUCH LEERZEILEN MIT IN DIE NEUE DATEI UND JETZT DAS.....
::
:: PROBLEM:
:: WENN ()!"§$%&/()=? IN DER DATEI STEHT !,UND ODER EINE ZEILE MIT BLANKS AUFTAUCHT
:: STÜRZT DAS SCRIPT AB, WARUM ?? ICH MÖCHTE NUR DIE ZEILEN ERSETZEN WO DER SUCHSTRING
:: AUFTAUCHT UND ANSONSTEN DIE DATEI ORIGINAL LASSEN BEI DIESEN CMD MISST KLAPPT NIX!!!
:: WER KANN HELFEN BESTEN DANK...
::------------------------------------------------------------------
@ECHO off
CLS
:ProMain
SET "QuellDatei=c:\test\test.txt"
SET "ZielDatei=c:\test\test2.txt"
SET "SeachStr=NSA CIA"
SET "ReplaceStr=DIESE ZEILE WURDE ERSTEZT !"
::--- WENN QUELLDATEI EXISTIERT LÖSCHE DIESE ---
IF EXIST "%QuellDatei%" (
DEL /F "%QuellDatei%"
)
::--- WENN ZIELDATEI EXISTIERT LÖSCHE DIESE ---
IF EXIST "%ZielDatei%" (
DEL /f "%ZielDatei%"
)
::--- LEGE VERZEICHNIS C:\TEST\ AN WENNN NCHT VORHANDEN ---
IF NOT EXIST "c:\test\" (
MD "c:\test\"
)
::--- EINGABE SUCHESTRING ---
SET /p "SeachStr=Eingabe Suchstring:"
CLS
::--- ERZEUGE DATEI %QuellDatei% ---
ECHO Text der gefunden werden muss sgNSA CIAblabal >"%QuellDatei%"
ECHO Wissenschaft ist die Erweiterung des Wissens >>"%QuellDatei%"
ECHO NSA CIA das muss gefunden werden >>"%QuellDatei%"
ECHO DIE NÄCHSTE ZEILE IST LEER >>"%QuellDatei%"
ECHO.>>%QuellDatei%
ECHO DIE NÄCHSTEN 2 ZEILEN SIND LEER >>"%QuellDatei%"
ECHO.>>%QuellDatei%
ECHO.>>%QuellDatei%
ECHO weitere Zeile . >>"%QuellDatei%"
ECHO TEST=das ist nur ein Testtext >>"%QuellDatei%"
ECHO Test diese Zeile darf nicht gefunden werden NSA >>"%QuellDatei%"
ECHO __ZEIGE DATEI AN #VORHER#________________________
ECHO.
TYPE "%QuellDatei%"
ECHO.
ECHO _________________________________________________
::--- IF EINGABE Q oder q EXIT SCRIPT ---+
IF /I "%SeachStr%"=="q" GOTO BYE
FOR /f "delims=" %%i IN ('FINDSTR /N $ "%QuellDatei%"') DO (
SET "zeile=%%i"
CALL :ProReplaceLine
)
ECHO __ZEIGE DATEI AN #NACHHER#_______________________
ECHO.
TYPE "%ZielDatei%"
ECHO.
ECHO _________________________________________________
GOTO ProMain
:ProReplaceLine
::--- STRING GEFUNDEN JA NEIN J/N ---
ECHO %zeile%|find /i "%SeachStr%" >NUL && SET "gefunden=J"
ECHO %zeile%|find /i "%SeachStr%" >NUL || SET "gefunden=N"
::--- DIE NUMMER ABSCHNEIDEN, MUSS LEIDER VORHER GENERIERT WERDEN
:: SONST WERDEN KEINE LEERZEILEN IN DATEI GESCHRIEBEN ---
SET "zeile=%zeile:~3%"
IF "%zeile%" EQU "" (
::--- SCHREIBE LEERZEILE IN DATEI ---
ECHO.>>"%ZielDatei%"
) ELSE (
IF /I "%gefunden%"=="J" (
::--- ERSETZE ZEILE IN DATEI ---
ECHO %ReplaceStr%>>"%ZielDatei%"
) ELSE (
::--- SCHREIBE ORIGINALZEILE IN DATEI ---
ECHO %zeile%>>"%ZielDatei%"
)
)
GOTO :EOF
::--- END OF LINE....... ---
:BYE
Z W I S C H E N L Ö S U N G
Habe jetzt einen Zwischenlösung die halbwegs funktioniert....aber bei zeichen wie !"§$%&/()=?`*'+#ß`*#+`ß0 in Datei hängt sich das Script auf
es liegt an der
Zeile: FOR /f "delims=" %%i IN ('FINDSTR /N $ "%QuellDatei%"') DO ABSTURTZ BEI ZEICHEN WIE !"§$%&/()=??'*`?= usw.
Zeile: FOR /f "delims=" %%i IN ('FINDSTR . "%QuellDatei%"') DO übergibt KEINE LEERZEILEN
FRAGE: was ist da Falsch ???
DANKE FÜR EURE HILFE....
REM ------------------------------------------------------------------
@ECHO off
CLS
CHCP 850 & REM *** CODEPAGE AUF 850 SETZEN ***
REM -GLOBALVARIABLEN--------------------------------------------------
SET "QuellDatei=c:\test\test3.txt"
SET "ZielDatei=c:\test\test4.txt"
SET "SeachStr=Suchtext"
SET "ReplaceStr=#ZEILENTEXT DER ERSETZ WURDE VAR: ReplaceSt#"
:ProMain
SET /A "NrCount=0"
IF NOT EXIST "c:\test\" (
MD "c:\test\"
)
REM --- 0 BYTE DATEI ANLEGEN UND ÜBERSCHREIBEN ---
TYPE NUL >c:\test\test4.txt
REM --- EINGABE SUCHESTRING ---
SET /p "SeachStr=Eingabe Suchstring:"
REM --- IF EINGABE Q oder q EXIT SCRIPT ---
IF /I "%SeachStr%"=="q" GOTO BYE
CLS
ECHO __#VORHER#_ZEIGE_DATEI_AN_________________________
TYPE "%QuellDatei%"
ECHO __________________________________________________
REM ---QUELL-DATEI ZEILENWEISE AUSLESEN UND IN VARIABLE "zeile" SCHREIBEN ---
FOR /f "delims=" %%i IN ('FINDSTR /N $ "%QuellDatei%"') DO (
SET "zeile=%%i"
SET /A "NrCount=NrCount+1"
CALL :ProReplaceLine
)
ECHO __#NACHER#_ZEIGE_DATEI_AN_________________________
TYPE "%ZielDatei%"
ECHO __________________________________________________
GOTO ProMain
REM --- ERSTEZEN -------------
:ProReplaceLine
CALL :ProNrCut & REM ---NUMMERN WIEDER ABSCHNEIDEN ---
CALL :ProCheckgefunden & REM ---PRÜFEN OBB STRING IN ZEILE GEFUNDEN WURDE J/N ---
CALL :ProReplaceGo & REM --- DATEI WIEDER ZUSAMMENBAUEN ---
GOTO :EOF
REM ---NUMMERN WIEDER ABSCHNEIDEN ---
:ProNrCut
IF %NrCount% LSS 10 (
SET "zeile=%zeile:~2%" & REM --- 0-9 ÜBERPRÜFEN NUMMERRIERUNG WIEDER RAUS ---
)
IF %NrCount% GEQ 10 (
IF %NrCount% LEQ 99 (
SET "zeile=%zeile:~3%" & REM --- 10-99 ÜBERPRÜFEN NUMMERRIERUNG WIEDER RAUS ---
)
)
IF %NrCount% GEQ 100 (
IF %NrCount% LEQ 999 (
SET "zeile=%zeile:~4%" & REM --- 100-999 ÜBERPRÜFEN NUMMERRIERUNG WIEDER RAUS ---
)
)
IF %NrCount% GEQ 1000 (
IF %NrCount% LEQ 9999 (
SET "zeile=%zeile:~5%" & REM --- 100-999 ÜBERPRÜFEN NUMMERRIERUNG WIEDER RAUS ---
)
)
GOTO :EOF
REM ---PRÜFEN OBB STRING IN ZEILE GEFUNDEN WURDE J/N ---
:ProCheckgefunden
REM --- STRING GEFUNDEN JA NEIN J/N ---
ECHO %zeile%|find /i "%SeachStr%" >NUL && (
SET "gefunden=J"
) || (
SET "gefunden=N"
)
GOTO :EOF
REM --- DATEI WIEDER ZUSAMMENBAUEN ---
:ProReplaceGo
IF "%zeile%"=="" (
REM --- SCHREIBE LEERZEILE IN DATEI ---
ECHO.>>"%ZielDatei%"
) ELSE (
IF /I "%gefunden%"=="J" (
REM --- ERSETZE ZEILE IN DATEI ---
ECHO %ReplaceStr%>>"%ZielDatei%"
) ELSE (
REM --- SCHREIBE ORIGINALZEILE IN DATEI ---
ECHO %zeile%>>"%ZielDatei%"
)
)
GOTO :EOF
REM --- END OF LINE....... ---
:BYE
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Frank am 15.11.2013 um 16:55:06 Uhr
Den Quellcode ein wenig formatiert.
Content-ID: 221988
Url: https://administrator.de/forum/batch-zeilen-in-einen-textdatei-austauschen-script-stuerzt-manchmal-ab-221988.html
Ausgedruckt am: 09.04.2025 um 10:04 Uhr
6 Kommentare
Neuester Kommentar
Hallo Viper-Berlin!
Wenn Du nicht gerade Zeilen hast, die mit einem Doppelpunkt beginnen, könnte das etwa so gehen:
Grüße
bastla
P.S.: Eine passende Formatierung Deines Batch-Ansatzes (als "Code") kannst Du auch nachträglich noch hinzufügen ...
Wenn Du nicht gerade Zeilen hast, die mit einem Doppelpunkt beginnen, könnte das etwa so gehen:
ECHO off & setlocal
:: SCRIPT BY: VIPY (Nov 2013) ------------------------------
:: SCRIPT ERSETZT ZEILEN WENN DER SUCHSTRING IN ZEILE GEFUNDEN WURDE! SUCHE ZEILEN MIT SUCHSTRING "SeachStr"
:: IN DATEI "QuellDatei" UND ERSETZT DIE KOMPLETTE ZEILE MIT "ReplaceStr" SCHREIBT DABEI EINEN NEUE DATEI "ZielDatei"
::------------------------------------------------------------------
:ProMain
SET "QuellDatei=c:\test\test.txt"
SET "ZielDatei=c:\test\test2.txt"
SET "SearchStr=NSA CIA"
SET "ReplaceStr=DIESE ZEILE WURDE ERSTEZT !"
::--- WENN QUELLDATEI EXISTIERT LÖSCHE DIESE ---
DEL /F "%QuellDatei%" 2>nul
::--- WENN ZIELDATEI EXISTIERT LÖSCHE DIESE ---
DEL /f "%ZielDatei%" 2>nul
::--- LEGE VERZEICHNIS C:\TEST\ AN WENNN NCHT VORHANDEN ---
MD "c:\test" 2>nul
::--- EINGABE SUCHESTRING ---
SET /p "SearchStr=Eingabe Suchstring: "
CLS
::--- ERZEUGE DATEI %QuellDatei% ---
>"%QuellDatei%" ECHO Text der gefunden werden muss sgNSA CIAblabal
>>"%QuellDatei%" ECHO Wissenschaft ist die Erweiterung des Wissens
>>"%QuellDatei%" ECHO NSA CIA das muss gefunden werden
>>"%QuellDatei%" ECHO DIE NÄCHSTE ZEILE IST LEER
>>"%QuellDatei%" ECHO.
>>"%QuellDatei%" ECHO DIE NÄCHSTEN 2 ZEILEN SIND LEER
>>"%QuellDatei%" ECHO.
>>"%QuellDatei%" ECHO.
>>"%QuellDatei%" ECHO weitere Zeile .
>>"%QuellDatei%" ECHO TEST=das ist nur ein Testtext
>>"%QuellDatei%" ECHO Test diese Zeile darf nicht gefunden werden NSA
ECHO ZEIGE DATEI AN #VORHER#
ECHO.
TYPE "%QuellDatei%"
ECHO.
ECHO _
::--- IF EINGABE Q oder q EXIT SCRIPT ---+
IF /I "%SearchStr%"=="q" GOTO :eof
FOR /f "tokens=1* delims=:" %%i IN ('FINDSTR /N "^" "%QuellDatei%"') DO (
SET "zeile=%%j"
CALL :ProReplaceLine
)
ECHO ZEIGE DATEI AN #NACHHER#_
ECHO.
TYPE "%ZielDatei%"
ECHO.
ECHO ___
GOTO ProMain
:ProReplaceLine
setlocal enabledelayedexpansion
::--- STRING GEFUNDEN JA NEIN J/N ---
ECHO "%zeile%"|find /i "%SearchStr%">NUL && (
REM --- ERSETZE ZEILE IN DATEI ---
>>"%ZielDatei%" ECHO %ReplaceStr%
) || (
REM --- SCHREIBE ORIGINALZEILE IN DATEI ---
>>"%ZielDatei%" ECHO.%zeile%
)
endlocal
GOTO :EOF
bastla
P.S.: Eine passende Formatierung Deines Batch-Ansatzes (als "Code") kannst Du auch nachträglich noch hinzufügen ...
Hallo Viper-Berlin!
Batch ist bei komplexeren Textinhalten nicht das richtige Werkzeug - versuch es mit dem folgenden VBScript:
Grüße
bastla
Batch ist bei komplexeren Textinhalten nicht das richtige Werkzeug - versuch es mit dem folgenden VBScript:
Quelle = "c:\test\test.txt"
Ziel = "c:\test\test2.txt"
SearchStr = "NSA CIA"
ReplaceStr = "DIESE ZEILE WURDE ERSETZT !"
Ein = InputBox("Eingabe Suchstring: ")
If Ein <> "" Then SearchStr = Ein
Set fso = CreateObject("Scripting.FileSystemObject")
T = Split(fso.OpenTextFile(Quelle).ReadAll, vbNewLine)
For i = 0 To UBound(T)
If InStr(T(i), SearchStr) > 0 Then T(i) = ReplaceStr
Next
fso.CreateTextFile(Ziel).Write Join(T, vbNewLine)
bastla