ibicis 10 Geschrieben 15. November 2012 Melden Teilen Geschrieben 15. November 2012 Hallo, ist es mgl., mit find.exe (findstr ist leider nicht mgl., da das Zeichenformat in den txt-Dateien Unicode ist) in einer Datei nach mehreren Strings zu suchen und den Inhalt der enthaltenden Dateien komplett in eine Datei zu exportieren? Konkret geht es um die Log-Dateien, die von Backup Exec erzeugt werden. Eine Log-Datei hat bspw. diesen Aufbau: Servername : SERVER-BACKUP1Auftragsname : Laufwerk inventarisieren Auftragsprotokoll: C:\Program Files\Symantec\Backup Exec\Data\BEX_SERVER-BACKUP1_01443.xml Gerätename : QUANTUM 1 Schacht Strichcode Medienkennung StatusGerät ------------------------------------------------------------------------------------------------ Montag QUANTUM 1 Auftrag gestartet: Montag, 12. November 2012 14:00:01 Auftrag beendet : Montag, 12. November 2012 14:00:23 Abschlussstatus : Erfolgreich Mein Anliegen ist eigentlich simpel: Wird in allen Log-Dateien, die im Verzeichnis "Data" unterhalb des Installationspfades liegen, das aktuelle Datum (das geht mit der Variable "%date%") sowie der String "Laufwerk inventarisieren" gefunden, so soll deren kompletter Inhalt in eine Datei geschrieben werden, die ich dann mittels Script als E-Mail verschicke. Find.exe kann aber nur nach 1 String suchen, man müsste also die Suche verknüpfen, sodass nach "%date%" und "Laufwerk inventarisieren" gesucht wird. Außerdem müsste man find.exe anweisen, bei positivem Treffer den kompletten Inhalt einer Datei auszulesen, nicht nur die Trefferzeile. Geht das so überhaupt oder bin ich mit meiner Idee total auf dem Holzweg? Falls letztes zutrifft, wie kann ich mein Anliegen trotzdem realisieren? Danke vorab. Zitieren Link zu diesem Kommentar
jarazul 10 Geschrieben 15. November 2012 Melden Teilen Geschrieben 15. November 2012 Du kennst Powershell? Zitieren Link zu diesem Kommentar
olc 18 Geschrieben 15. November 2012 Melden Teilen Geschrieben 15. November 2012 Hi, warum möchtest Du die Datei einlesen - hat BackupExec kein Ereignisprotokoll bzw. nutzt es nicht die Windows Ereignisprotokolle? Ansonsten würde ich auch vorschlagen, die PowerShell zu nutzen. Mittels Get-Content, Select-String und Konsorten läßt sich Dein Vorhaben sicher recht einfach und schnell lösen. Sofern die Logdateien im XML-Format vorliegen, kannst Du diese mit der PowerShell noch einfacher einlesen. Viele Grüße olc Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 15. November 2012 Melden Teilen Geschrieben 15. November 2012 (bearbeitet) Hallo in der Erklärung von find wird die Einzahl Zeichenfolge verwendet. Bei Angabe von meheren Zeichenfolgen gibt es Fehlermeldungen z.B. Datei Zeichenfolge2 nicht gefunden. Auch werden nur mehrere Zeichenfolgen in einer Zeile gefunden, nicht in mehrerern. Bei findstr wird in der Erklärung die Mehrzahl Zeichenfolgen verwendet. Könnte man vor dem Verwenden von findstr die Codepage änderen? bearbeitet 15. November 2012 von lefg Zitieren Link zu diesem Kommentar
ibicis 10 Geschrieben 16. November 2012 Autor Melden Teilen Geschrieben 16. November 2012 Hi, warum möchtest Du die Datei einlesen - hat BackupExec kein Ereignisprotokoll bzw. nutzt es nicht die Windows Ereignisprotokolle? Ansonsten würde ich auch vorschlagen, die PowerShell zu nutzen. Mittels Get-Content, Select-String und Konsorten läßt sich Dein Vorhaben sicher recht einfach und schnell lösen. Sofern die Logdateien im XML-Format vorliegen, kannst Du diese mit der PowerShell noch einfacher einlesen. Viele Grüße olc Danke für die erste konstruktive Bemerkung hier.Ich habe wenig Erfahrung mit PS, gestern probierte ich noch mit select-string herum, bekam es aber nicht hin, bei einem Treffer den kompletten Inhalt einer Datei zu extrahieren und Dateien einzulesen, die das Datum des aktuellen Tages haben (egal, ob an dem Tag erstellt oder das Datum als String in der Datei). Stets wurden immer alle Dateien ausgelesen, die den entsprechenden String beinhalten. Mit get-date kann ich mir zwar das aktuelle Datum ausgeben lassen, aber wie suche ich nach einem String, der gleich dem aktuellen Datum ist, ohne dass ich dieses explizit angeben muss. Es müsste also nach einer Variable gesucht werden, was ich nicht hinbekomme. Mit select-string könnte ich z.B. nach "Auftragsname : Laufwerk inventarisieren" in einer Datei suchen, die das aktuelle Datum beinhaltet oder das Änderungsdatum des aktuellen Tages aufweist und PS anweisen, bei beiden Übereinstimmungen den kompletten Inhalt der Datei auszugeben. Zitieren Link zu diesem Kommentar
olc 18 Geschrieben 16. November 2012 Melden Teilen Geschrieben 16. November 2012 Hi, mittels "Select-String -Context X,Y" Parameter kannst Du, wenn Du weißt wie viele Zeilen bei einem Event vor und nach Deinem Suchstring angegeben sind, die Ausgabe um den Suchstring herum ausgeben. Wenn Du weiter gehen möchtest, kannst Du auch mit Regular Expressions arbeiten, die PowerShell bietet dort eine Menge Möglichkeiten. Noch einmal explizit nachgefragt: BackupExec bringt kein Eventlog mit? Viele Grüße olc Zitieren Link zu diesem Kommentar
ibicis 10 Geschrieben 16. November 2012 Autor Melden Teilen Geschrieben 16. November 2012 ...Noch einmal explizit nachgefragt: BackupExec bringt kein Eventlog mit? ... Ich hatte gestern im Windows Eventviewer nach einem Backup Exec (BE) Reiter gesucht, fand aber auf dem betreffenden Server nichts dergleichen. Die Events, die von BE in "Application" geschrieben werden, beziehen sich nicht auf die Inventarisierung. Zitieren Link zu diesem Kommentar
ibicis 10 Geschrieben 16. November 2012 Autor Melden Teilen Geschrieben 16. November 2012 Mit select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 > inventarisieren-ausgabe.txt erreiche ich, dass alle txt-Dateien mit dem übereinstimmmenden String aufgelistet werden. So weit, so gut. Wenn ich nun PS anweisen kann, alle Zeilen der Ausgabe, mit Ausnahme der letzten 7 Zeilen, zu löschen, bräuchte ich nicht nach Datum filtern, da die benötigten Infos immer ganz unten in den 7 letzten Zeilen stehen. Kann mir evtl. jemand sagen, wie ich das erreiche? Danke vorab. Das geht so: $ausgabe = "d:\data\a-powershell-ausgabe.txt" select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 > a-powershell-ausgabe.txt (Get-Content $ausgabe | Select-Object -Last 7) | Set-Content $ausgabe Zitieren Link zu diesem Kommentar
olc 18 Geschrieben 16. November 2012 Melden Teilen Geschrieben 16. November 2012 Entweder auf "Get-Content" ausweichen und ein | Select -Last 7 anhängen oder das o.g. "Select" nach dem Select-String mittels Pipe wie oben anhängen. Viele Grüße olc Zitieren Link zu diesem Kommentar
ibicis 10 Geschrieben 16. November 2012 Autor Melden Teilen Geschrieben 16. November 2012 Gibt es noch eine Mgl., die ersten xx Characters aus jeder Zeile zu entfernen? Danach suche ich in der PS-Hilfe vergeblich. Zitieren Link zu diesem Kommentar
olc 18 Geschrieben 16. November 2012 Melden Teilen Geschrieben 16. November 2012 Du kannst in den Ergebnissen springen, sprich im Text nach unten, rechts oder sonst wohin wechseln :): foreach ($item in $ausgabe) { $text = "$($result.Context.[b]PostContext[3].Substring(3)[/b])" $text } Zitieren Link zu diesem Kommentar
ibicis 10 Geschrieben 19. November 2012 Autor Melden Teilen Geschrieben 19. November 2012 (bearbeitet) Würde der gesamte Befehl dann etwa so ausschauen? $ausgabe = "d:\data\a-powershell-ausgabe.txt" select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 > a-powershell-ausgabe.txt foreach ($item in $ausgabe) { $text = "$($result.Context.PostContext[3].Substring(3))" $text } (Get-Content $ausgabe | Select-Object -Last 7) | Set-Content $ausgabe Irgendwie klappt es so nicht. Die Ausgabe ist nun wieder genauso groß wie ohne die Filterung "Select-Object -Last 7". Was mache ich falsch? Die Ausgabe kommt folgendermaßen formatiert an: BEX_SERVER-BACKUP_01463.txt:2:Auftragsname : Laufwerk inventarisieren BEX_SERVER-BACKUP_01463.txt:3:Auftragsprotokoll: C:\Program Files\Symantec\Backu p Exec\Data\BEX_SERVER-BACKUP_01463.xml BEX_SERVER-BACKUP_01463.txt:4:Gerätename : QUANTUM 1 BEX_SERVER-BACKUP_01463.txt:5: BEX_SERVER-BACKUP_01463.txt:6: BEX_SERVER-BACKUP_01463.txt:7:Schacht Strichcode Medienkennung StatusGerät BEX_SERVER-BACKUP_01463.txt:8:-------------------------------------------------- ---------------------------------------------- BEX_SERVER-BACKUP_01463.txt:9: Samstag 3 QUANTUM 1 BEX_SERVER-BACKUP_01463.txt:10: BEX_SERVER-BACKUP_01463.txt:11:Auftrag gestartet: Samstag, 17. November 2012 14: 00:02 BEX_SERVER-BACKUP_01463.txt:12:Auftrag beendet : Samstag, 17. November 2012 14: 00:27 BEX_SERVER-BACKUP_01463.txt:13:Abschlussstatus : Erfolgreich Es müssten die ersten 33 Characters jeder Zeile gekürzt werden. bearbeitet 19. November 2012 von ibicis Zitieren Link zu diesem Kommentar
olc 18 Geschrieben 19. November 2012 Melden Teilen Geschrieben 19. November 2012 Hi, ich habe gerade keine Zeit mir das genauer anzuschauen - aber Du liest oben die Original-Datei wieder ein, anstatt Deinen ersten gefilterten Export zu nutzen. Probiere es einmal in dieser Richtung: $ausgabe = "d:\data\a-powershell-ausgabe.txt" $filtered = select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 $result = foreach ($item in $filtered) { $text = "$($item.Context.PostContext[3].Substring(3))" $text } (Get-Content $result | Select-Object -Last 7) | Set-Content $ausgabe Viele Grüße olc Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.