Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch bei bestimmten Wörtern jeweilige Zeile entfernen

Frage Entwicklung Batch & Shell

Mitglied: Beginner01

Beginner01 (Level 1) - Jetzt verbinden

27.09.2014 um 13:48 Uhr, 2508 Aufrufe, 19 Kommentare

Hallo an Alle,

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

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
Mitglied: rubberman
27.09.2014 um 15:48 Uhr
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
Bitte warten ..
Mitglied: Beginner01
27.09.2014, aktualisiert um 17:25 Uhr
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.
Bitte warten ..
Mitglied: rubberman
27.09.2014 um 17:45 Uhr
Hallo Beginner01,

nehmen wir an, du hast eine Datei "test.txt" ...
01.
aaa	bbb	ccc 
02.
aaa	abc	ccc 
03.
111	222	333 
04.
111	222	123
... und willst alle Zeilen rausschmeißen, die abc oder 123 enthalten.
01.
@echo off &setlocal 
02.
 
03.
REM Datei, die du verarbeiten willst: 
04.
set "file=test.txt" 
05.
 
06.
REM Suchzeichenfolgen in Anführungszeichen gesetzt und durch ein Leerzeichen getrennt: 
07.
set search="123" "abc" 
08.
 
09.
 
10.
set "tmpfile=%temp%\%file%.tmp~" 
11.
setlocal EnableDelayedExpansion 
12.
<"!file!" >"!tmpfile!" ( 
13.
  for /f %%i in ('type "!file!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do ( 
14.
    set "line=" &set /p"line=" 
15.
    set "found=" 
16.
    if defined line ( 
17.
      for %%k in (!search!) do ( 
18.
        if "!line!" neq "!line:%%~k=!" set "found=1" 
19.
20.
      if not defined found echo(!line! 
21.
    ) else ( 
22.
      echo( 
23.
24.
25.
26.
move /y "!tmpfile!" "!file!"
Grüße
rubberman
Bitte warten ..
Mitglied: Beginner01
27.09.2014 um 17:49 Uhr
Danke rubberman, ich teste es und schreibe dann wieder ob es funktioniert...
Bitte warten ..
Mitglied: Beginner01
27.09.2014 um 17:57 Uhr
Leider ist diese Datei (vorher 30 Megabyte groß) jetzt leer, dasselbe Resultat wie bei allen Batches, welche ich getestet hatte... Vll. eine weitere Idee?
Bitte warten ..
Mitglied: rubberman
27.09.2014 um 18:14 Uhr
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
Bitte warten ..
Mitglied: colinardo
27.09.2014, aktualisiert um 18:56 Uhr
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
Bitte warten ..
Mitglied: Beginner01
27.09.2014 um 18:53 Uhr
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?
Bitte warten ..
Mitglied: rubberman
27.09.2014 um 20:19 Uhr
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
Bitte warten ..
Mitglied: Beginner01
27.09.2014 um 20:52 Uhr
Schade, danke trotzdem für deine Antwort rubberman. Vielleicht hat ja jemand anderes noch eine Idee?
Bitte warten ..
Mitglied: Beginner01
27.09.2014 um 20:54 Uhr
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...
Bitte warten ..
Mitglied: colinardo
28.09.2014, aktualisiert um 16:51 Uhr
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 ?
Bitte warten ..
Mitglied: Beginner01
28.09.2014 um 21:41 Uhr
Danke Uwe. Wie und womit muss ich denn das Skript emullieren und mit welcher Dateiendnung abspeichern? Mit Powershell kenne ich mich leider NULL aus.
Bitte warten ..
Mitglied: Beginner01
28.09.2014 um 21:42 Uhr
Danke Uwe. Wie und womit muss ich denn das Skript emullieren und mit welcher Dateiendnung abspeichern? Mit Powershell kenne ich mich leider NULL aus.
Bitte warten ..
Mitglied: Beginner01
28.09.2014 um 21:57 Uhr
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
Bitte warten ..
Mitglied: colinardo
28.09.2014, aktualisiert 29.09.2014
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

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
01.
param( 
02.
  [string]$path, 
03.
  [string]$woerter 
04.
05.
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..


Anleitung: 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.
Starten 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
Starten 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.
Starten 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"
Bitte warten ..
Mitglied: Beginner01
29.09.2014 um 21:02 Uhr
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.
Bitte warten ..
Mitglied: Beginner01
08.10.2014 um 17:23 Uhr
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!
Bitte warten ..
Mitglied: colinardo
08.10.2014, aktualisiert um 17:26 Uhr
Schön da du es geschafft hast, den Beitrag dann bitte noch auf gelöst setzen. Merci.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...