135335
Goto Top

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
$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"  
}
}

Content-Key: 362934

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Arano
Solution Arano Jan 31, 2018 updated at 08:42:29 (UTC)
Goto Top
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 $error den Wert von Select-String enthalten. Also ab ins Manual und nachgeschlagen MS-Docs - PS - Select-String #Output
By 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.

...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
Mitglied: 135333
Solution 135333 Jan 31, 2018 updated at 08:46:30 (UTC)
Goto Top
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
$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"  
}
Um stattdessen gleich den Dateinamen auszugeben wenn ein Fehler gefunden wurde machst du es stattdessen so
Get-Content "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 | Select-String -Pattern "Error" -SimpleMatch | select -Expand Filename  
Gruß snap
Mitglied: 135335
135335 Jan 31, 2018 at 10:29:32 (UTC)
Goto Top
Dachte mir das SimpleMatch hauptsächlich nur dafür da ist, wenn Sonderzeichen vorhanden sind. Seht Screenshot

Hat dann jemand von euch eine Buchempfehlung, die evtl besser ist?
Diese beiden hab ich mir zugelegt

1. [Scripting mit Windows PowerShell 3.0 - Der Workshop: Skript-Programmierung mit Windows PowerShell 3.0 vom Einsteiger bis zum Profi https://www.amazon.de/dp/B06XDV2TRG/ref=cm_sw_r_cp_api_GyzCAb8VJQJWF]
Bei dem steht nichts von -quiet und nur 3 Treffer bei -SimpleMatch

2. PowerShell 5: Windows-Automation für Einsteiger und Profis https://www.amazon.de/dp/B01H5N4OTC/ref=cm_sw_r_cp_api_0BzCAbRSHC108
Da steht weder -SimpleMatch noch -quiet drin

Screenshot
eda20469-0e50-40e7-8074-9d2a17949b94

Und soweit ich weiß ist grep ein anderes wort für find bei CMD oder lieg ich da auch falsch?
Mitglied: 135333
135333 Jan 31, 2018 updated at 10:41:04 (UTC)
Goto Top
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. ...
Mitglied: 135335
135335 Jan 31, 2018 updated at 11:29:57 (UTC)
Goto Top
Oky, wenn das so weitergeht, muss ich wohl einen kurs machen

Eine frage hätte ich nocht

Kann man bei den Code irgendwie angeben, dass er nicht die letzten 10 oder 20Zeilen sondern die letzten 15sekunden suchen soll?
Also irgendwie so select -last 15s

$result = Get-Content "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -Last 10 | Select-String -Pattern "Error" -SimpleMatch -quiet   
Mitglied: 135333
135333 Jan 31, 2018 updated at 11:39:06 (UTC)
Goto Top
, 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.
Mitglied: 135335
135335 Jan 31, 2018 at 13:58:09 (UTC)
Goto Top
Das 2.te
Was in den letzten 15s eingetragen/hinzugefügt wurde
Oky, werde ich woll hinbekommen