none
Problem mit count-Funktion bei Eventlog RRS feed

  • 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

    Mittwoch, 18. Mai 2011 14:57

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/
    Mittwoch, 18. Mai 2011 22:40
    Moderator

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/
    Mittwoch, 18. Mai 2011 22:40
    Moderator
  • 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

    Donnerstag, 19. Mai 2011 10:08