Powershell: Zeile in Log Datei schreiben, die gesuchten String enthält?
Hallo zusammen,
ich durchsuche meine Festplatte nach einem String. Alle Dateien, die diesen String enthalten werden via Out-File -Filepath $out in eine Text Datei geschrieben. Mit welchem Befehl kann man zusätzlich die Zeile, in der der String gefunden wird, mit in die logs schreiben?
VG
1 Antwort
Im einfachsten Fall kannst Du einfach den guten alten Consolenbefehl findstr benutzen und den Outpu in die Gewünschte Datei umleiten. (das funktioniert sowohl in Cmd/Batch als auch in Powershell
findstr /s /n /c:"Suchtext" "*.txt" >"test.log"
...für die ganze festplatte
findstr /s /n /c:"Suchtext" "C:\*.txt" >"test.log"
Nur in Powershell geht auch das:
findstr /s /n /c:"Suchtext" "*.cmd" | Out-File -FilePath 'test.log'
Mit Powershell Cmdlets:
suche im aktuellen Ordner mit Select-String
Select-String -Path "*.*" -Pattern "Suchtext"
Soll auch recursiv in Unterordnern gesucht werden, müssen zuvor die Dateien von Get-ChildItem bereitgestellt werden.
Get-ChildItem -Recurse | Select-String -Pattern "Suchtext"
Natürlich kannst Du auch Einfluss auf die Art des Outputs nehmen:
Get-ChildItem -Recurse | Select-String -Pattern "echo" |Select-Object Path,LineNumber |Format-Table
Ob Du die Daten auf dem Bildschirm oder in eine Datei ausgibst ist lediglich eine Frage der Umleitung am Ende der Pipeline.
...| Out-File -FilePath 'test.log'
...>'test.log'
...| Tee-Object 'test.log'
aber Aufgepasst!!!!!
Die OutputDatei darf bei einem Dateifilter *.* nicht im zu durchsuchenden Pfad liegen, sonst hat man eine Endlosschleife, weil der gefundene String in die Datei umgeleitet wird, und dort gefunden wird und dort gefunden wird. und dort gefunden wird.... (bei findstr kein Problem)
oder die Outputdatei per -Exclude -parameter von den Funden ausschließen:
Get-ChildItem -exclude 'test.log' |.....
Wenn Du die ganze Festplatte durchsuchen willst, ist der Zugriff auf einige Ordner beschränkt da muss man Fehler mit -ErrorAction SilentlyContinue unterdrücken .
am Ende sieht die sache in etwa so aus:
Get-ChildItem -Path 'C:\' -Filter '*.txt' -Exclude 'test.log' -Recurse -ErrorAction SilentlyContinue | Select-String -Pattern "Suchstring" | Tee-Object 'test.log'