Benutzer mit den meisten Antworten
Problem mit count-Funktion bei Eventlog

Frage
-
hallo zusammen,
als vorwarnung: ich bin noch anfänger bei der powershell ;-)
ich habe ein script gebastelt, das auf bestimmte events im eventlog prüft und ggf. eine email schreibt. nun habe ich neulich auf windows 7 (x64) umgestellt und mein script funktioniert nicht mehr. zumindest war ich der meinung, dass es vorher schon einmal funktioniert hat.
die zeilen sehen im original so aus:
$LogSys = get-EventLog -logname system -after $(get-date).adddays(-3)
if (($LogSys | where {(($_.entryType -eq "Error") -or ($_.entryType -eq "Warning")) -and (($_.source -eq "Ntfs") -or ($_.source -eq "disk") -or ($_.source -eq "ftdisk")) }).count -gt 0) {...
aber ich habe festgestellt, dass die count funktion keinen wert zurückgibt. ich habe es auf folgende vereinfachung herunterbrechen können:
$LogSys = get-EventLog -logname system -after $(get-date).adddays(-3)
$LogSys | where {($_.entryType -eq "Warning") -and ($_.source -eq "Ntfs") } # gibt (im moment) eine zeile aus dem eventlog aus
($LogSys | where {($_.entryType -eq "Warning") -and ($_.source -eq "Ntfs") }).count # der gleiche code wie oben, nur mit count - keine rückgabe
($LogSys | where {($_.entryType -eq "Warning")}).count # hier funktioniert die count-funktion und gibt (im moment) "9" zurück.vermutlich ist die antwort sehr einfach, aber im moment ist das brett einfach zu fest an meinen kopf genagelt ;-)
vielen dank schon einmal für eure hilfe.
-naaaarf
Antworten
-
.count funktioniert nur, wenn es mehr als einen Eintrag gibt. Denn nur dann erhältst du ein Array zurück und damit dann auch die .count - Eigenschaft.
Zur Verdeutlichung, teste mal dies mit verschiedenen Werten (so das du mal nur ein Event und mal mehrere zurückbekommst):
$LogSys = get-EventLog -logname system -after $(get-date).adddays(-3) $sys = ($LogSys | where {($_.entryType -eq "Warning") -and ($_.source -eq "Ntfs") }) $sys -is [array]
Ein möglicher Weg das Problem zu umgehen wäre dieser:$LogSys = get-EventLog -logname system -after $(get-date).adddays(-1) @($LogSys | where {($_.entryType -eq "Warning") -and ($_.source -eq "Ntfs") }).count
Durch das @ wird in jedem Fall ein Array angelegt, egal wieviele Einträge es gibt, daher bekommst du nun auch 0 oder 1 als Antwort.
Grüße, Denniver
http://bytecookie.wordpress.com/- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 19. Mai 2011 13:03
Alle Antworten
-
.count funktioniert nur, wenn es mehr als einen Eintrag gibt. Denn nur dann erhältst du ein Array zurück und damit dann auch die .count - Eigenschaft.
Zur Verdeutlichung, teste mal dies mit verschiedenen Werten (so das du mal nur ein Event und mal mehrere zurückbekommst):
$LogSys = get-EventLog -logname system -after $(get-date).adddays(-3) $sys = ($LogSys | where {($_.entryType -eq "Warning") -and ($_.source -eq "Ntfs") }) $sys -is [array]
Ein möglicher Weg das Problem zu umgehen wäre dieser:$LogSys = get-EventLog -logname system -after $(get-date).adddays(-1) @($LogSys | where {($_.entryType -eq "Warning") -and ($_.source -eq "Ntfs") }).count
Durch das @ wird in jedem Fall ein Array angelegt, egal wieviele Einträge es gibt, daher bekommst du nun auch 0 oder 1 als Antwort.
Grüße, Denniver
http://bytecookie.wordpress.com/- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 19. Mai 2011 13:03
-
ahhhhhhh, super, vielen dank :)
ist gut zu wissen, dass count nur mit arrays arbeitet.. ich hätte eigentlich eine "falscher objekttyp" meldung erwartet in so einem fall bzw. wenn andere objekte diese eigenschaft nicht haben, eine "eigenschaft nicht gefunden" meldung.. aber ok, jetzt weiß ichs.. :)
vielen dank nochmal.
-naaaarf