none
Powershell: Wie bekomme ich das in eine vernünftige Form? RRS feed

  • Frage

  • Hallo,

    ich habe Folgenden Aufruf.

    Dieser gibt aus was ich haben möchte, nämlich Servernaname, Prozessname, Username und Speichernutzung.

    ####################################################
    01.
    get-wmiobject win32_process|where{$_.name -eq "iexplore.exe"}|where{$_.ws -gt "300000000"}|select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS
    #######################################################

    Jetzt möchte ich das in eine Schleife umbauen

    So ungfähr

    ##############################################################
    $Serverliste = get-content serverliste.txt 
    ForEach ($Server in $Serverliste){ 
    get-wmiobject win32_process -computer $Server|where{$_.name -eq "iexplore.exe"}|where{$_.ws -gt "300000000"}|select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS 
    }

    ################################################################


    Jezt kommt meine Frage, ich möchte wenn die Speichernutzung einen Grenzwert überschritten hat ein Event auslösen. Ne Mail an die Admins. Wie bekomme ich diese Zeile auseinander gebaut so das ich die einzelnen Werte ansprechen kann? In dem Fall $_.WS denn wenn der zu groß ist soll ne Mail raus.

    Vg
    Andreas
    Donnerstag, 23. Mai 2013 09:11

Antworten

  • Hallo,

    Peters Antwort ist schon richtig :-)

    Einfach kurz $Process durch $_ ersetzten ... siehe:

    Write-Host "Warnung! Prozess: $($Prozess.name), WS: $($Prozess.WS)"
    zu 
    
    Write-Host "Warnung! Prozess: $($_.name), WS: $($_.WS)"
    Gruß Malte

    • Bearbeitet Malte Brodersen Donnerstag, 23. Mai 2013 13:42
    • Als Antwort markiert Joshua32 Freitag, 24. Mai 2013 12:38
    Donnerstag, 23. Mai 2013 13:42
  • Ja! Sorry ! Das war ein Flüchtigkeits fehler!

    Get-Wmiobject win32_process |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "300000000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object { Write-Host "Warnung! Prozess: $($_.name), WS: $($_.WS)"}


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Als Antwort markiert Joshua32 Freitag, 24. Mai 2013 12:38
    Donnerstag, 23. Mai 2013 16:33

Alle Antworten

  • Habe nun versucht folgende Variable zu definieren $a und versucht mit write-host $a.name auszugeben. Doch da stimmt was nicht funktioniert nicht.

    Gebe ich am PowerShell Prompt die Zeile ein und frage die Variable simpel mit $a ab erhalte ich ein Ergebniss wie es sein sollte.

    Allerdings auch nur $a ich bekommen keine Antwort wenn ich sage $a.name diese Variable scheint leer zu sein. hmmmm jemand eine Idee?

    $Serverliste = get-content serverliste.txt 
    ForEach ($Server in $Serverliste){ 
    $a = get-wmiobject win32_process -computer $Server|where{$_.name -eq "iexplore.exe"}|where{$_.ws -gt "300000000"}|select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS 
    if($res.WS -gt 300000){ 

        write-host Warnung! Prozess: $($res.name), WS: $($res.WS)

    }

    }

    Donnerstag, 23. Mai 2013 09:45
  • Zuerst einemal musst du die verdoppel mopplung aus deinem Kopf entfernen!

    Warum nimmst du 2 mal hintereinander Where-Object ? Dazu benutzt man -and oder -or verknüpfungen.
    Das Where filtert dir schon Prozesse mit einem WS von 300000000 heraus ! Da is das IF 300000000 unnötig!

    Warum Sortierst du die Prozesse das macht nur für Menschen einen Sinn!

    Get-Wmiobject win32_process |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "300000000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object { Write-Host "Warnung! Prozess: $($Prozess.name), WS: $($Prozess.WS)"}
    Es gibt in der PowerShell 2 Verschieden ForEach !
    Da musst du aufpassen!
    Einmal das ForEach-Object { ... } Cmdlet und die ForEach ($File in Files) { ... } Schleife !
    Gemeinerweise hat das ForEach-Object { ... } Cmdlet einen Alias der ForEach { ... } heisst!
    Da kommt man schnell durcheinander!
    Der Unterschied ist, das ForEach-Object { ... } Cmdlet wird in der Pipeline eingesetzt und die ForEach ($Computer  in $Computers) { ... } Schleife nicht!
    Die ForEach Schleife ist schneller als das ForEach-Object Cmdlet.
    Bei dem ForEach Cmdlet wird jedes Objekt einzeln in der Pipeline weitergegeben so wird kein Array benötigt.
    Die ForEach( X in Y){ … } Schleife benötigt ein Array das alle Objekte enthält enthält.
    Ein Array für eine ForEach Schleife kann bei sehr vielen Dateien sehr viel Speicher verbrauchen, das ist ungünstig.
    Bei einer geringen Anzahl an Objekten (kleine  Datenmenge) ist es egal wann man das Cmdlet und wann die Schleife nimmt


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Donnerstag, 23. Mai 2013 10:46
  • Hallo,

    erst mal vielen Dank für deine Anregung.

    Ich denke da einfach noch viel zu kompliziert.

    Jetzt habe ich die Zeilen von dir in ein Script gepackt und natürlich getestet was dabei raus kommt.

    Leider ist es so das für Write-Host "Warnung! Prozess: $($Prozess.name), WS: $($Prozess.WS)" nur Folgendes ausgespuckt wird:

    Warnung! Prozess: , WS:

    Heißt das, dass die Variablen nicht gefüllt werden? Die Bedingung war ja erfüllt und wurde auch gehandelt.

    Donnerstag, 23. Mai 2013 12:36
  • Hallo,

    Peters Antwort ist schon richtig :-)

    Einfach kurz $Process durch $_ ersetzten ... siehe:

    Write-Host "Warnung! Prozess: $($Prozess.name), WS: $($Prozess.WS)"
    zu 
    
    Write-Host "Warnung! Prozess: $($_.name), WS: $($_.WS)"
    Gruß Malte

    • Bearbeitet Malte Brodersen Donnerstag, 23. Mai 2013 13:42
    • Als Antwort markiert Joshua32 Freitag, 24. Mai 2013 12:38
    Donnerstag, 23. Mai 2013 13:42
  • Ja! Sorry ! Das war ein Flüchtigkeits fehler!

    Get-Wmiobject win32_process |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "300000000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object { Write-Host "Warnung! Prozess: $($_.name), WS: $($_.WS)"}


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Als Antwort markiert Joshua32 Freitag, 24. Mai 2013 12:38
    Donnerstag, 23. Mai 2013 16:33
  • $a=get-content c:\temp\serverliste.txt
    
    
    foreach($server in $a){
    
    Get-Wmiobject win32_process -computer $server |
        Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
            Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
            ForEach-Object { write-host "Warnung! Auf Server: $($_.__Server),Prozess: $($_.name), WS: $($_.WS), User: $($_.owner)"}
    }

    Vielen Dank ich bin jetzt schon mal ein riesen Stück weiter und die Ausgabe klappt wie ich mir das vorstelle.

    Habe jetzt noch eine Antwortdatei erstellt und mit Servernamen gefüllt damit ich die Abfrage Schedulen kann.

    Hintergrund ist wir haben immer wieder massive sporadische Auslastung auf unseren Servern, und um Zeitnah schauen zu können was der User auf dem Terminalserver

    macht wenn die Auslastung mal wieder extrem hoch ist dieses kleine Script das dan im 5Minutentakt laufen soll.

    Ich möchte jetzt noch zwei Dinge einbauen, einmal das alle Ergebnisse in einem Log gesammelt werden und wenn es ein log gibt das dieser per SMTP versendet wird

    Wollte jetzt die Zeile mit Write-Host durch Out-File -append ersetzen leider habe ich hier nur Fehler erhalten warum geht das nicht?

    ForEach-Object { out-file "c:\temp\log.txt" -append "Warnung! Auf Server: $($_.__Server),Prozess: $($_.name), WS: $($_.WS), User: $($_.owner)"}

    Wo bau ich den Mailversand am besten ein? In die Schleife, oder außerhalb?

    In der Schleife wäre wahrscheinlich doof da er dann ja gegebenenfalls 200Mails rauswirft, nach der Schleife wäre am besten aber wie verknüpfe ich die beiden Aktionen.

    Na dem Motto if exist new file Send-MailMessage mit Datei if nix neues mach nix :)

    Freitag, 24. Mai 2013 12:50