
135335
31.01.2018
Textsuche in der letzten log
Ich bin noch ein richtiger Anfänger in Powershell
Wie der Name schon sagt, möchte ich einen bestimmten Text suchen in der Datei
Aber irgendwas mache ich da was verkehrt
Bei mir kommt immer die else-funktion zur Vorschein, obwohl der Text in der Datei vorhanden ist
Bei Get-Content, da kommt weder eine Fehlermeldung noch die Else oder sonst was
Ich stehe komplett auf dem Schlauch
Get-Content
Get-Childitem
Oder extra einen String schreiben, ging auch nicht
Wie der Name schon sagt, möchte ich einen bestimmten Text suchen in der Datei
Aber irgendwas mache ich da was verkehrt
Bei mir kommt immer die else-funktion zur Vorschein, obwohl der Text in der Datei vorhanden ist
Bei Get-Content, da kommt weder eine Fehlermeldung noch die Else oder sonst was
Ich stehe komplett auf dem Schlauch
Get-Content
$error = Get-Content D:\Powershell\*.txt | sort LastWriteTime -Descending | select -First 1 | Select-String -Pattern "Error"
if ($error -match $true) {
Write-Host "gefunden"
} else {
Write-Host "nichts"
}
Get-Childitem
$file = Get-ChildItem -Path D:\Powershell\*.txt | sort LastWriteTime -Descending | select -First 1 | Select-String -pattern "Error"
if ($file -match $true) {
Write-Host "Error vorhanden"
} else {
Write-Host "weiter"
}
Oder extra einen String schreiben, ging auch nicht
function get-error0 {
$file = Get-ChildItem -Path D:\Powershell\*.txt LastWriteTime -Descending | select -First 1
$error0 = Select-String -pattern "Error"
if ($error0 -match $file) {
Write-Host "Error vorhanden"
} else {
Write-Host "weiter"
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 362934
Url: https://administrator.de/forum/textsuche-in-der-letzten-log-362934.html
Ausgedruckt am: 13.04.2025 um 10:04 Uhr
7 Kommentare
Neuester Kommentar
Guten Morgen.
1. Ich habe gar kein Windows ;)
Sitze aber dennoch öfters mal an einem und lese daher mit.
Und aus der allgemeinen "Programmiererfahrung" heraus: Wenn eine Bedingung immer Falsch ist, steht in der Variable meistens/oft nicht das was man erwartet hat. Letzten Endes sollte
Scrollen bis folgendes kommt (oder generell mit [Strg+F] über die Suche abkürzen)
...Uhhh... Witzige Sache: http://tio.run
~Arano
//ich hole mir besser noch nen Kaffee
1. Ich habe gar kein Windows ;)
Sitze aber dennoch öfters mal an einem und lese daher mit.
Und aus der allgemeinen "Programmiererfahrung" heraus: Wenn eine Bedingung immer Falsch ist, steht in der Variable meistens/oft nicht das was man erwartet hat. Letzten Endes sollte
$error
den Wert von Select-String
enthalten. Also ab ins Manual und nachgeschlagen MS-Docs - PS - Select-String #OutputBy default, the output is a set of MatchInfo objects, one for each match found.
Deine Bedingung allerdings liest sich für mich wie ein TRUE/FALSE Vergleich... weitergelesen...If you use the Quiet parameter, the output is a Boolean value indicating whether the pattern was found.
Na das klingt doch schon mal besser, und da wir schon im Manual sind, gleich zum erwähnten Abschnitt MS-Docs - PS - Select-String #Optional Parameters springen.Scrollen bis folgendes kommt (oder generell mit [Strg+F] über die Suche abkürzen)
-Quiet
Indicates that the cmdlet returns a Boolean value (True or False), instead of a MatchInfo object. The value is True if the pattern is found; otherwise, the value is False.
Indicates that the cmdlet returns a Boolean value (True or False), instead of a MatchInfo object. The value is True if the pattern is found; otherwise, the value is False.
...Uhhh... Witzige Sache: http://tio.run
$err = "Hallo Welt","Administrator" | Select-String -Pattern "Welt" -Quiet
if( $err -match $true ){ Write-Host "Okay" }
else { Write-Host "not okay" }
Okay
Ohne "-Quiet" bekomme ich das "not okay". Ist auch klar denn die Bedingung kann nicht nach "TRUE" aufgelöst werden da der Verlgeich mit dem "Objekten" stattfindet die als Treffer zurückgegeben werden (Kann ja auch mehrfach vorkommen dein Suchmuster).~Arano
//ich hole mir besser noch nen Kaffee

Du vergleichst hier Äpfel mit Birnen, du solltest erst mal nachlesen was welcher Vergleichsoperator macht. -Match zu, Bsp. vergleicht anhand von Regular Expressions und das ist hier falsch weil du als Ergebnis ein Object mit Eigenschaften von Select-String bekommst! Zusätzlich nutzt du nicht den Parameter -SimpleMatch um Textvergleich zu machen statt einem Regular Expressions Vergleich
Um stattdessen gleich den Dateinamen auszugeben wenn ein Fehler gefunden wurde machst du es stattdessen so
Gruß snap
$result = Get-Content "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 | Select-String -Pattern "Error" -SimpleMatch -quiet
If ($result){
"error found"
}else{
"error not found"
}
Get-Content "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 | Select-String -Pattern "Error" -SimpleMatch | select -Expand Filename

Dachte mir das SimpleMatch hauptsächlich nur dafür da ist, wenn Sonderzeichen vorhanden sind.
Nun ja bei Regex is fast alles sehr speziell, wenn du bspw, ohne den Parameter nach Bud.Spenser suchen würdest würde er auch folgendem String matchen BudXSpenser weil der Punkt für ein beliebiges Zeichen steht. Ich wollte dich nur darauf hinweisen denn Anfänger fallen da sonst meist gleich auf die Fresse.Und soweit ich weiß ist grep ein anderes wort für find bei CMD oder lieg ich da auch falsch?
Grep ist in der Powershell ein Alias für Select-String, genau so wie ls oder gci oder dir für Get-Childitem usw.Schau einfach in die Referenz zu den CMDLets im Technet! Dort stehen alle Parameter.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

, dass er nicht die letzten 10 oder 20Zeilen
Quatsch, das select -First 1 oben im Skript selektiert die erste Datei in der Pipeline nicht die ersten Zeilen!Um Dateien auf eine Zeit zu beschränken musst du einen where-Filter einbauen wenn du Dateien inkludieren willst die innerhalb dieses Zeitraums erstellt wurden.
Oder meinst du das was in den letzten 15s in der Datei eingetragen wurde. Dann musst du das Skript dauerhaft in einer WHILE-Schleife laufen lassen.
p.s. Neue Fragen sollten auch einen neuen Thread bekommen sonst wird das ein Chaos-Thread.