beginner01
Goto Top

Batch bei bestimmten Wörtern jeweilige Zeile entfernen

Hallo an Alle,

ich bin mal wieder einer derjenigen, die einfach keine
Ahnung haben und Alles haben wollen face-wink

Habe zwar bereits div. Skripte (Batches), dennoch sind
diese alle aus dem Internet kopiert und laufen nicht.

Mein Betriebssystem: Windows Server 2012

Meine benötigte Batchdatei, wie in der Überschrift
bereits angegeben.
Es sollen mehrere txt Dateien ausgelesen werden und diese
überschreiben werden. Es soll in allen Dateien
(unterschiedliche Anzahl an Zeilen, ändert sich
stündlich) nach bestimmten Wörtern gesucht werden. Sofern
diese Wörter vorhanden sind, soll bei jedem dieser Wörter
die jeweilige Zeile entfernt werden (keine Leerzeilen).

Die txt Dateie zu auslesen sind "einfache Listen" mit
Tabs zwischen den Wörtern/ Zahlen/ Zeichen.

Leider funktioniert bisher keine Batchdatei, von denen,
die ich zugegebenermaßen kopiert habe.

Wer ist so lieb und hilft mir?

LG Markus

Content-ID: 250358

Url: https://administrator.de/contentid/250358

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

rubberman
rubberman 27.09.2014 um 15:48:15 Uhr
Goto Top
Hallo Beginner01, willkommen im Forum.

Man kann mit Batch nicht einfach Zeilen löschen. Die Datei muss in jedem Fall neu geschrieben werden (unter Auslassung der Zeilen mit deinen Suchbegriffen).
Stolperfalle: In der Zwischenzeit könnte sich der Inhalt der Datei bereits ändern, wenn ich dich richtig verstanden habe.

Könnte das ein Problem werden?

Grüße
rubberman
Beginner01
Beginner01 27.09.2014 aktualisiert um 17:25:49 Uhr
Goto Top
Hallo rubberman,

nein das kann kein Problem werden, da die abzuändernden txt Dateien erst nachdem sie heruntergeladen worden sind vom System abgeändert werden sollen.

Ich habe ja wie bereits erwähnt Batch Skripte gefunden, nur diese geben mir immer eine leere Textdatei aus. D.h. funktionieren nicht.
Gefunden habe ich folgende Batchskripte: fgrep als Zusatzsoftware zum entfernen, funktioniert nicht. Eine Batchdatei von Bastla (denke mal der User ist bekannt), diese läuft ebenfalls nicht.

Ich vermute es liegt am Betriebssystem, denn unter Windows XP funktionieren diese und unter Windows Server 2012 leider nicht. Ich möchte auf Senkeys (oder wie die Software sich nennt) verzichten, es sollte nach Möglichkeit eine Batchdatei (nach Möglichkeit ohne Zusatzsoftware) sein.
rubberman
rubberman 27.09.2014 um 17:45:43 Uhr
Goto Top
Hallo Beginner01,

nehmen wir an, du hast eine Datei "test.txt" ...
aaa	bbb	ccc
aaa	abc	ccc
111	222	333
111	222	123
... und willst alle Zeilen rausschmeißen, die abc oder 123 enthalten.
@echo off &setlocal

REM Datei, die du verarbeiten willst:
set "file=test.txt"  

REM Suchzeichenfolgen in Anführungszeichen gesetzt und durch ein Leerzeichen getrennt:
set search="123" "abc"  


set "tmpfile=%temp%\%file%.tmp~"  
setlocal EnableDelayedExpansion
<"!file!" >"!tmpfile!" (  
  for /f %%i in ('type "!file!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" &set /p"line="  
    set "found="  
    if defined line (
      for %%k in (!search!) do (
        if "!line!" neq "!line:%%~k=!" set "found=1"  
      )
      if not defined found echo(!line!
    ) else (
      echo(
    )
  )
)
move /y "!tmpfile!" "!file!"  
Grüße
rubberman
Beginner01
Beginner01 27.09.2014 um 17:49:25 Uhr
Goto Top
Danke rubberman, ich teste es und schreibe dann wieder ob es funktioniert...
Beginner01
Beginner01 27.09.2014 um 17:57:28 Uhr
Goto Top
Leider ist diese Datei (vorher 30 Megabyte groß) jetzt leer, dasselbe Resultat wie bei allen Batches, welche ich getestet hatte... Vll. eine weitere Idee?
rubberman
rubberman 27.09.2014 um 18:14:06 Uhr
Goto Top
Da niemand deine realen Daten und Suchzeichenfolgen kennt, wird es leider auch keine Lösung geben. Ich kann nur eine Testumgebung schaffen, wie ich das oben auch getan habe ... damit funktioniert es.

Grüße
rubberman
colinardo
colinardo 27.09.2014 aktualisiert um 18:56:15 Uhr
Goto Top
Moin,
wenn Powershell für dich in Frage käme, reicht auch ein Einzeiler:
dir "C:\Ordner\*.txt" | % {(gc $_.FullName) -notmatch 'WortA|WortB|WortC' | Set-Content -Path $_.Fullname }
'WortA|WortB|WortC' sind die gesuchten Wörter die jeweils mit einer PIPE voneinander getrennt werden (Bitte beachten, das ist ein Regular Expression String, spezielle Regex-Sonderzeichen müssen darin mit Backslash escaped werden.)

Grüße Uwe
Beginner01
Beginner01 27.09.2014 um 18:53:45 Uhr
Goto Top
71361363146 Test1 Test2 Test3
71345263146 Test4 Test5 Test6

so sieht der Inhalt der txt Datei aus (immer dieselben Abstände)


Suche nach z.B der Zahl 3 und Zahl 1, wenn diese vorkommt, dann die demenstsprechende Zeile löschen.

Mit Windows XP funktioniert dein Skript, mit Window Server 2012 nicht. Woran könnte das liegen/ gibt es weitere Ideen?
rubberman
rubberman 27.09.2014 um 20:19:22 Uhr
Goto Top
Zitat von @Beginner01:

Mit Windows XP funktioniert dein Skript, mit Window Server 2012 nicht. Woran könnte das liegen/ gibt es weitere Ideen?

Kann ich leider nicht nachvollziehen, sorry. Hab weder Zugriff auf XP, noch Server 2012. Meine Testumgebung ist Win7 x86.

Grüße
rubberman
Beginner01
Beginner01 27.09.2014 um 20:52:20 Uhr
Goto Top
Schade, danke trotzdem für deine Antwort rubberman. Vielleicht hat ja jemand anderes noch eine Idee?
Beginner01
Beginner01 27.09.2014 um 20:54:38 Uhr
Goto Top
Mir würde diese Funktion auch per Java (kein Javaskript) reichen, wenn ich die Wörter, bei denen die jeweiligen Zeilen gelöscht werden sollen in einer Textdatei, welche von der Javadatei ausgelesen wird abändern kann. Ebenfalls wäre es super, wenn diese bereits kompilliert ist. Danke an Alle, die helfen möchten...
colinardo
colinardo 28.09.2014 aktualisiert um 16:51:41 Uhr
Goto Top
Zitat von @Beginner01:

Mir würde diese Funktion auch per Java (kein Javaskript) reichen,
wieso jetzt in Java, wenn doch Powershell(Script siehe oben) seit Windows 7 in jeder Windows-Version enthalten ist ? Soll das irgendwie aus einer Webanwendung heraus aufgerufen werden ?
Beginner01
Beginner01 28.09.2014 um 21:41:37 Uhr
Goto Top
Danke Uwe. Wie und womit muss ich denn das Skript emullieren und mit welcher Dateiendnung abspeichern? Mit Powershell kenne ich mich leider NULL aus.
Beginner01
Beginner01 28.09.2014 um 21:42:32 Uhr
Goto Top
Danke Uwe. Wie und womit muss ich denn das Skript emullieren und mit welcher Dateiendnung abspeichern? Mit Powershell kenne ich mich leider NULL aus.
Beginner01
Beginner01 28.09.2014 um 21:57:05 Uhr
Goto Top
Hallo Uwe, voneinader getrennt, bedeutet dann gelöscht oder wie darf ich das verstehen? Es geht ja (nur) darum diejenigen Zeilen in den Textdatei zu entfernen, welche bestimmte (mehrere) Wörter enthalten. Wie erstelle ich die Funktion, d.h. Texteditor, als ganz normale bat-Datei abspeichern oder mittels einer Software emulieren? lg Markus
colinardo
colinardo 28.09.2014, aktualisiert am 29.09.2014 um 13:01:42 Uhr
Goto Top
Zitat von @Beginner01:

Hallo Uwe, voneinader getrennt, bedeutet dann gelöscht oder wie darf ich das verstehen? Es geht ja (nur) darum diejenigen
Zeilen in den Textdatei zu entfernen, welche bestimmte (mehrere) Wörter enthalten.
klar, genau das macht ja das Script !!

Wie erstelle ich die Funktion, d.h.
Texteditor, als ganz normale bat-Datei abspeichern
Du hast einen Server 2012 und hast noch nie was mit Powershell gemacht ? kann ich kaum glauben face-smile

Zum ausprobieren kannst du einfach eine Powershell-Konsole öffnen (powershell.exe), und die Zeile eintippen.

Die Wörter die das Löschen der Zeilen in der Textdatei auslösen sollen gibst du wie oben schon geschrieben mit einer Pipe voneinander getrennt in der Code-Zeile an, feddich !

Wenn es dann läuft wie gewünscht, kannst du das ganze in einer Datei mit der Endung *.ps1 speichern und mit powershell.exe "c:\deinscript.ps1" ausführen lassen.

Natürlich lassen sich die Werte mit Variablen versehen und dann über die Kommandozeile übergeben. Das Script sähe dann so aus
param(
  [string]$path,
  [string]$woerter
)
dir $path | % {(gc $_.FullName) -notmatch $woerter | Set-Content -Path $_.Fullname }
Der Aufruf aus einer CMD-Shell sähe dann bspw. so aus
powershell.exe -File "C:\deinscript.ps1" "C:\Pfad\datei.txt" "Wort1|Wort2|Wort3"

Vorher aber bitte die Execution-Policy anpassen, sonst kannst du keine Scripte ausführen. Siehe Anleitung weiter unten...

Grüße Uwe

p.s. Du kannst deine Beiträge auch bearbeiten, dann braucht es nicht zwei drei Posts
mit dem selben Inhalt..face-sad


back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topStarten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Beginner01
Beginner01 29.09.2014 um 21:02:18 Uhr
Goto Top
Hallo Uwe, danke Dir und danke an Alle. Habe tatsächlich noch nicht mit Powershell gearbeitet. Bin eben ein Beginner und habe den Server bisher zu anderen Zwecken genutzt. Ich bin wirklich fasziniert von der Anleitung und den Skripten und teste diese die Tage. Super und vielen Dank! Ihr könnt Euch sicher sein, dass ich Euch ein Feedback geben werde, ob ich Alles hin bekommen habe.
Beginner01
Beginner01 08.10.2014 um 17:23:28 Uhr
Goto Top
Viiiiiiieln Dank nochmals an Alle! Es funktioniert Alles wunderbar! Habe die Lösung von Uwe genommen. Habe wieder einmal wieder viel dazu gelernt. Danke Danke Danke!
colinardo
colinardo 08.10.2014 aktualisiert um 17:26:50 Uhr
Goto Top
Schön da du es geschafft hast, den Beitrag dann bitte noch auf gelöst setzen. Merci.