Jump to content

Get-Process und Write-Host mit Änderung der Farbe


Direkt zur Lösung Gelöst von Dukel,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Moin,

 

Prozesse mittels Powershell filtern und farblich ausgeben lassen, habe ich mir selbst eingebrockt. Mein bisherige Lösung ist schon krass dürftig. Die Idee ist alle Prozesse mit ID, Prozessname und Arbeitsspeicherverbrauch aufzulisten und dann nach Verbrauch zu sortieren (Prozesse bis 99 MB sollen grün, ab 100 gelb und ab 300 MB rot erscheinen) Meine bisherige Lösung:

$Red = Get-Process | Where-Object {$_.WorkingSet -ge 314572800} 
$Red | ForEach-Object {Write-Host $_.ID $_.ProcessName $_.WorkingSet -ForegroundColor "Red"} 

$Yellow = Get-Process | Where-Object {($_.WorkingSet -ge 103809025) -and ($_.WorkingSet -lt 314572800)} 
$Yellow | ForEach-Object {Write-Host $_.ID $_.ProcessName $_.WorkingSet -ForegroundColor "Yellow"} 

$Green = Get-Process | Where-Object {$_.WorkingSet -le 103809024} 
$Green | ForEach-Object {Write-Host $_.ID $_.ProcessName $_.WorkingSet -ForegroundColor "Green"} 

Vieles daran gefällt mir jedoch nicht. Die Ausgabe ist vom Format her Mist, jedoch bekomme ich das mit format-table nicht mehr gefiltert. Wahrscheinlich ist die Umsetzung mit einer Schleife besser, als es nacheinander auszugeben. Außerdem wäre die Anzeige in MB natürlich sinniger.

 

Hat jemand eine Tipp? Vielen Dank schon mal. Ich probiere jetzt mal den Kram in eine Schleife zu integrieren. Bin jedoch wieder ganz am Anfang mich da einzugrooven. Das muss doch kürzer und besser möglich sein. :-(

Link zu diesem Kommentar
Get-Process | Select-Object @{label='Working'; expression={
 if($_.WorkingSet -le 103809024){
  "$($_.ProcessName) {0:N2}" -f ($_.WorkingSet/1MB) | write-host -foregroundcolor Green
 }elseif(($_.WorkingSet -ge 103809025) -and ($_.WorkingSet -lt 314572800)){
  "$($_.ProcessName) {0:N2}" -f ($_.WorkingSet/1MB) | write-host -foregroundcolor Yellow
 }else{
  "$($_.ProcessName) {0:N2}" -f ($_.WorkingSet/1MB) | write-host -foregroundcolor Red
 }
}
}

Leider Passt das nicht nicht so ganz.

Link zu diesem Kommentar

Ich würde Get-Process nicht dreimal aufrufen ... einmal reicht. 

 

Wow ... is Dukel schnell ... 

$Header = '{0,10} {1,10} {2,25}' -f 'ProcessId', 'WorkingSet', 'ProcessName' 
Write-Host $Header -ForegroundColor 'White'
Get-Process |  # Sort-Object -Property WorkingSet -Descending |
ForEach-Object {
    $Process = $_
    switch ($Process.WorkingSet) {
        {($Process.WorkingSet / 1MB) -ge 300} {
            $OutString = '{0,10} {1,10} {2,25}' -f $Process.ID, ([MATH]::Round($Process.WorkingSet / 1MB,2)), $Process.ProcessName 
            Write-Host $OutString -ForegroundColor 'Red'
            break
         }
        {($Process.WorkingSet / 1MB) -ge 100} {
            $OutString = '{0,10} {1,10} {2,25}' -f $Process.ID, ([MATH]::Round($Process.WorkingSet / 1MB, 2)), $Process.ProcessName 
            Write-Host $OutString -ForegroundColor 'Yellow'
            break
        }
        Default { 
            $OutString = '{0,10} {1,10} {2,25}' -f $Process.ID, ([MATH]::Round($Process.WorkingSet / 1MB, 2)), $Process.ProcessName 
            Write-Host $OutString -ForegroundColor 'Green'
        }
    }
}

Edit:

Wenn Du übrigens die Prozesse sortiert ausgeben möchtest, nimmst Du einfach das Kommentarzeichen nach der Pipe nach dem Get-Process raus.   :thumb1::achtung:

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 1 Minute schrieb BOfH_666:

?? Hab ich was verpasst? Wieso geht's jetzt auf einmal um LogicalDisk? Ich dachte wir wären bei Prozessen?

https://docs.microsoft.com/en-us/powershell/scripting/samples/selecting-parts-of-objects--select-object-?view=powershell-7.1

 

Das bezog sich auf die empfohlene Seite für die Regular Expressions^^. Siehe erster Post vom Duke. Ich kann der Syntax nicht so schnell folgen wie ihr^^. 

Link zu diesem Kommentar
vor 3 Minuten schrieb ceratull:

Dieser ToString F2 Teil bedeutet.

... ist eine kurze Schreibform für "Fixed Number, 2 Decimal Places"  ... also 2 Kommastellen. ;-)

Gerade eben schrieb ceratull:

Ich kann der Syntax nicht so schnell folgen wie ihr^^. 

... es geht nicht um Geschwindigkeit, sondern um Tiefe/Qualität!  ;-) 

 

Na dan nschau Dir mal mein Code-Beispiel an ... vielleicht gefällt's Dir ja.  Wenn Du übrigens die Prozesse sortiert ausgeben möchtest, nimmst Du einfach das Kommentarzeichen nach der Pipe nach dem Get-Process raus.  :achtung: :thumb1:

 

So ... ich muss jetzt erstmal ins Bett. Schlaft gut und träumt was Süßes!  ;-) :goodnight:

Link zu diesem Kommentar
  • Beste Lösung

Get-Process | Format-Table Id,
 @{label='Working'; expression= {
   "{0:N2}" -f ($_.WorkingSet/1MB)
  }
 },
 @{label='Process'; expression={
  if($_.WorkingSet -le 103809024){
   $color = '92' # Green
  }elseif(($_.WorkingSet -ge 103809025) -and ($_.WorkingSet -lt 314572800)){
   $color = '93' # Yellow
  }else{
   $color = '91' # Red
  }
  $e = [char]27
  "$e[${color}m$($_.ProcessName)${e}[0m"
 }
}

Geht jetzt als Format-Table.

Alternativ als Schleife wie von BOfH.

Link zu diesem Kommentar
vor 2 Minuten schrieb ceratull:

Verkürzungen in Powershell machen das ja auch kompliziert. 

Welche Verkürzungen??  Meinst Du Aliasse? ... bei meinem Code sind kein drin.

vor 2 Minuten schrieb ceratull:

 

Darf ich mit weiteren Fragen auf Euch zukommen?

Gern. Auf mich dann erst wieder in ca 9 - 10 Stunden.  ;-)    ... und jetzt bin ich weg.  :goodnight:

Link zu diesem Kommentar
13 minutes ago, ceratull said:

Welcher Teil passt nicht so ganz? Ich versuche noch zu verstehen was 


Get-CimInstance -Class Win32_LogicalDisk |
  Select-Object -Property Name, @{
    label='FreeSpace'
    expression={($_.FreeSpace/1GB).ToString('F2')}
  }

ToString('F2')}

Dieser ToString F2 Teil bedeutet.

https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#the-fixed-point-f-format-specifier

 

Das ist das Format der Ausgabe.

Link zu diesem Kommentar

Top, vielen Dank. Ich werde Eure Vorschläge erst mal auseinandernehmen, um sie zu verstehen. Mit Verkürzungen meine ich bestimmte Syntaxausdrücke wie z.B. %. 

Das war mir auf jeden Fall ein große Hilfe. Ich assimiliere das von Euch verpackte Wissen und werde es meiner Kultur, äh bescheidenen Powershell Kenntnissen hinzufügen. ;-)  

 

Spoileralarm für die nächste Aufgabe:

Lesen Sie alle Verzeichnisse von Laufwerk C: incl. Größe (MB) und letztem
Änderungsdatum aus. Speichern Sie die Daten in eine CSV Datei. Fangen Sie etwaige
Fehler für leere oder zugriffsgeschützte Verzeichnisse ab.
Hinweis: Die CSV-Datei wird in der nächsten Übung verwendet.

 

Die Aufgaben habe ich mir übrigens von meinem Arbeitskollegen vor fünf Jahren bekommen und ihn vorher gebeten mir mal Aufgaben zu stellen. Da ich jetzt akut versuche Python zu lernen, dachte ich man könnte ja endlich mal auch die alten Powershellaufgaben abliefern. Das Ergebnis ist da weniger wichtig, als sich mit der Materie generell zu beschäftigen und daraus zu lernen.

Link zu diesem Kommentar
vor 12 Stunden schrieb ceratull:

Mit Verkürzungen meine ich bestimmte Syntaxausdrücke wie z.B. %. 

Die Dinger heißen Aliasse. Und dazu gleich einen Tipp/Hinweis/Bitte. Aliasse gehören ausschließlich in die Konsole. In Scripten oder gar in Code, den Du in Foren postest, werden sie allgemein als sehr schlechter Stil und als unhöflich betrachtet. Idealerweise sollte Dein Code so ausführlich / explizit / beschreibend sein, wie möglich. Das macht ihn leichter lesbar und verständlich und zu pflegen. Hier gleich noch was zum Nachlesen zu dem Thema:  The (unofficial) Powershell Best Practice and Style Guide.

 

vor 12 Stunden schrieb ceratull:

Das war mir auf jeden Fall ein große Hilfe. Ich assimiliere das von Euch verpackte Wissen und werde es meiner Kultur, äh bescheidenen Powershell Kenntnissen hinzufügen. ;-)  

Bei den Borg ging sowas immer schnell .... :aetsch2:

vor 12 Stunden schrieb ceratull:

Spoileralarm für die nächste Aufgabe:

........

Dann bin ich schon mal gespannt auf Deinen Code.  ... man ist übrigens in den allerseltensten Fällen der Erste mit einer bestimmten Aufgabe oder mit einem bestimmten Problem. Meistens gibt es irgendwo schon jemanden, der schon mal nach dem gleichen oder einem ähnlichen Problem gesucht hat und dem dann vermutlich auch schon mal geholfen wurde. Deshalb findet man zu fast jedem Problem schon irgendwo eine Modell-Lösung, die man für eigene Verwendung übernehmen oder anpassen kann. Gute Quellen für Powershell sind z.B. die PowershellGallery oder StackOverflow oder das Microsoft Powershell Forum oder Reddit ... oder, oder, oder ... viel Spaß ;-) 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...