viper-berlin
Goto Top

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 face-wink

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

back-to-topZ 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.... face-wink

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
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: 22.12.2024 um 19:12 Uhr

bastla
bastla 14.11.2013 um 18:24:40 Uhr
Goto Top
Hallo Viper-Berlin!

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
Grüße
bastla

P.S.: Eine passende Formatierung Deines Batch-Ansatzes (als "Code") kannst Du auch nachträglich noch hinzufügen ...
Viper-Berlin
Viper-Berlin 15.11.2013 um 15:38:21 Uhr
Goto Top
Besten DANK.
Biber
Biber 15.11.2013 aktualisiert um 22:57:14 Uhr
Goto Top
Moin Viper-Berlin,

hast du denn auch bastlas kleine Bitte im P.S. gelesen und verstanden?
Und magst du bitte auch selbsttätig deine Frage auf "Gelöst" setzen, wenn sie das für dich ist?

Danke und schönes Wochenende
Biber
Viper-Berlin
Viper-Berlin 15.11.2013 um 23:58:33 Uhr
Goto Top
Servus Biber ,

nein die Aufgabe ist leider noch nicht gelöst...

ich brauche einen Job der aus einer Textdatei
1. Zeilen ausließest original
2. Zeilen bearbeitet
3. und Zeilen mit Originalinhalten zurückschreibt auch !"§$%&/()=?*'Ä'* und auch Zeilen mit nichts drin, oder nur Blanks usw
und das macht bis jetzt kein Script ????

Deshalb würde ich es gerne noch auf Ungelöst lassen.
Dieses CMD geraffel verbrät Zeit ohne Ende und man bekommt doch keine Sinnvolle Lösung hin.

hab immer noch die Frage:

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

ABSTURTZ BEI ZEICHEN WIE !"§$%&/()=??'*`?= usw############
Zeile: FOR /f "delims=" %%i IN ('FINDSTR /N $ "%QuellDatei%"') DO .

Übergibt KEINE LEERZEILEN DO DAS ZEILEN NACHHER FEHLEN ###########
Zeile: FOR /f "delims=" %%i IN ('FINDSTR . "%QuellDatei%"') DO

FRAGE: was ist da Falsch ???

Vielleicht hast du eine Lösung Biber ?
ich denke das ist ein generelle Problem mit dem ECHO Befehl, man bräuchte eine Procedure die Variableninhalte
umwandelt so das alles in ECHO Anweisung angezeigt werden
also das ECHO %TextKomplett% auch wirklich ausgegeben wird.

also besten Dank......
der Vipy
bastla
bastla 16.11.2013 um 10:45:05 Uhr
Goto Top
Hallo Viper-Berlin!

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)
Grüße
bastla
Viper-Berlin
Viper-Berlin 20.11.2013 um 12:05:08 Uhr
Goto Top
Schönen Dank face-wink

ok dann muss ich wohl VBS lernen, kannst du mir einen Seite empfehlen ?
was ist am einfachsten zu lernen Powershell VBS mit was macht man solche Jobs
für 2003 2008 Server usw. heute ??
Gibts für VBS einen kostenlosen Editor.

Besten Dank !