Batch String in einer Textdatei löschen

Shad0w93

Ensign
Registriert
Sep. 2012
Beiträge
220
Hallo,

ich muss einen bestimmten Teil aus einer Batch Datei löschen.
Der Teil sieht folgendermaßen aus:
Code:
Order XXXXXXXX successfully created. (XXXXXXXX = 8 stellige Zahl, die immer anders ist)

Ich muss in der ganzen Textdatei alle Zeilen löschen, die so aufgebaut sind.
Ist es möglich, wie in SQL nach beliebigen Zeichen zu suchen, wie zum Beispiel mit "Order ???????? successfully created." oder "Order ** successfully created."

Folgendes habe ich schon gefunden:
Code:
SETLOCAL enabledelayedexpansion

REM
REM Testprogramm
REM Suchen und Ersetzen in einer Textdatei
REM
REM http://www.supportnet.de/threads/1481757 
REM batti-batch 11/2007
REM
REM lauffaehig ab Windows 2000
REM 


SET "quell_datei=C:\test\log.txt"
SET "ziel_datei=C:\test\log_neu.txt"
SET "suchen_nach=Order ???????? successfully created."
SET "ersetzen_durch="

REM Ausgabe einer Fehlermeldung und Programmabbruch
REM falls die Variable "suchen_nach" nicht definiert ist
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)

REM Quell-Datei zeilenweise auslesen 
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter
:ersetzen
REM innerhalb der Variable "zeile"
REM den Inhalt der Variable "suchen_nach" suchen
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
IF [!zeile!] EQU [] (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof

:weiter
REM weitere Verarbeitung

ECHO Fertig^^!

Ich hoffe ihr könnt mir helfen
 
Muss es eine Batch-Datei sein? Sowas würde in einem PowerShell-Script wohl deutlich einfacher zu realisieren sein...
 
Wenn auf Win7 dann bitte in PowerShell wie gesagt.
Ich habe ähnliches schon in Batch realisiert. Es frisst Ressourcen und kopiert eigentlich nur die Datei wobei es gewisse Strings aus lässt.

AutoIt wäre sonst noch eine gute Alternative um bestehende Dateien zu durchsuchen und gewisse Strings zu ersetzen.
 
Nein es muss keine Batch sein.
Wie kann ich es am besten in Power Shell machen?
 
Dito. Ich würde es wohl hinbekommen, aber mache zu selten was mit der PowerShell, also ist es für mich auch etwas mehr Arbeit. :-)
 
Naja, für die PowerShell wird man vermutlich nicht weniger Tutorials finden. ;-)
 
Ich finde allerdings AutoIt für den nicht Itler ein wenig einfacher zu erlernen da es eine sehr logische Sprache mit einfacher Syntax ist.
 
Code:
Get-Content "C:\test\log.txt" | Foreach-Object {$_.Replace(" successfully created.","Neu")} | Set-
Content "C:\test\log_neu.txt

Dieser Code funktioniert. Er ersetzt als Beispiel successfully created durch Neu.
Aber was kann ich für die 8 stellige immer andere Nummer vorher machen?
** successfully created (geht nicht)
???????? successfully created (geht nicht)
 
Ich kann zwar nur C#, aber da PowerShell auf .Net basiert, sollte es so klappen:

PHP:
$reader = new-object System.IO.StreamReader("C:\ordner\datei.foo")
$text = $reader.readtoend()
$reader.close()
$text -replace "der text, der gelöscht werden soll"
$writer = new-object System.IO.StreamWriter("C:\ordner\datei.bar")
$writer.write($text)
$writer.flush()
$writer.close()

Dabei kann der befehl -replace als input regex benutzen, und wenn man nach dem "text, der gelöscht werden soll" ein , macht und wieder ein text, wird es ersetzt und nicht nur gelöscht (bzw mit nix ersetzt)

PHP:
$text -replace "dich mag ich nicht", "dich mag ich"
 
Zuletzt bearbeitet:
@BagBag:
Wie kann ich dort eine beliebige Zeichenkette filtern?

@1668mib:
Dein Code funktioniert bei mir nicht.
 
also das hier funktioniert bei mir:
Code:
findstr /V /R /B "^Order [0-9]{8} successfully created.$" C:\test\log.txt > C:\test\log_neu.txt

für diese Datei
Code:
a
Order 12345678 successfully created.
b

Edit:
Sonst versuch mal das hier - das beschränkt sich dann nicht mehr auf 8 Ziffern.
Code:
findstr /V /R /B "^Order * successfully created.$" C:\test\log.txt > C:\test\log_neu.txt
 
Zuletzt bearbeitet:
Hab es nun etwas erweitert, so, dass man die "Einstellungen" oben machen kann:


PHP:
#die datei, mit dem originalem text
$filetoread = "C:\ordner\datei.foo"

#die datei, in die der neue text soll, kann auch die gleiche datei sein
$filetowrite = "C:\ordner\datei.bar" 

#der Text, der ersetzt werden soll
$textoreplace = "Maus"

#der Text, der als ersatz dient, kann auch leer/nichts sein
$replacedtext = "Tastatur"

$reader = new-object System.IO.StreamReader($filetoread)
$text = $reader.readtoend()
$reader.close()
$text -replace $textoreplace, $replacedtext
$writer = new-object System.IO.StreamWriter($filetowrite)
$writer.write($text)
$writer.flush()
$writer.close()

Dieses Beispiel ließt nun den Text aus der Datei "C:\ordner\datei.foo"
Nehmen wir an, dieser ist: "Meine neue Maus gefällt mir"
dann wir nach "Maus" gesucht, und durch "Tastatur" ersetzt
zum schluss wird der neue text "Meine neue Tastatur gefällt mir" in die Datei "C:\ordner\datei.bar" geschrieben.
 
Zuletzt bearbeitet:
Findstr mag bei den RegEx die geschweiften Klammern nicht:

Suche mit 8 beliebingen Ziffern sieht dann (leider) so aus:
Code:
findstr /v /r /b "^Order [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] successfully created.$" C:\test\log.txt > C:\test\log_neu.txt
oder alternativ mit 8 beliebigen Zeichen:
Code:
findstr /v /r /b "^Order ........ successfully created.$" C:\test\log.txt > C:\test\log_neu.txt

Dabei wird jeweils die gesuchte Zeile komplett im neuen Log entfernt.
Soll die Zeile durch eine leere Zeile (oder durch eine Zeile mit anderem Inhalt) ersetzt werden, könnte dass auch so aussehen.
Code:
echo off
SETLOCAL enabledelayedexpansion

set quell_datei=C:\test\log.txt
set ziel_datei=C:\test\log_neu.txt

if exist %ziel_datei% del /f %ziel_datei%

for /f "delims=" %%i in (%quell_datei%) do (
    echo %%i|findstr /v /r /c:"^Order [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] successfully created.$">file.tmp
    set zeile=
    set /p zeile=<file.tmp
    
    if "!zeile!"=="" (
        echo.>>%ziel_datei%
    ) else (
        echo !zeile!>>%ziel_datei%
    )
)
del file.tmp
echo on
 
Zuletzt bearbeitet:
Lustigerweise hatte ich die beiden Schnipsel von dir mit den unschönen 8 Wiederholungen beide noch (Edit: also die hatte ich so zuerst und dann rauseditiert, weil die Variante mit geschweifter Klammer eigentlich die schönere ist). Im Zweiten is glaub ich noch ein Leerzeichen zu viel reingerutscht vor successfully.

Bei mir gibt es keine Probleme mit der geschweiften Klammer komischerweise, sitze aber gerade an einem Windows-XP-Rechner.
 
Zuletzt bearbeitet:
Leerzeichen im 2ten Beispiel ist entfernt.
Getestet habe ich unter Win 7, scheint da wohl einen Rückschritt zu geben. :(
 
Würde aber vermutlich einfach die Variante mit dem * nehmen, sofern es keine ähnliche Zeilen geben kann, die dann unerwünscht gefiltert würden.

Teste es heute abend wohl auch noch bei mir an einem Windows-7-Rechner... schon erstaunlich, wenn das nicht mehr gehen sollte...


Edit:
Mir fällt auf, dass man korrekterweise den Punkt am Ende der Zeile mit einem Backslash noch maskieren müsste... aber draufgesch...en
 
Zurück
Oben