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
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/contentid/221988
Ausgedruckt am: 22.11.2024 um 10:11 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