Jump to content

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


Go to solution Solved by Dukel,

Recommended Posts

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 to post
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 to post

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:

Edited by BOfH_666
  • Like 1
Link to post

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.

Link to post
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 to post
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:

  • Like 1
Link to post

Puuh das wird ein langer haariger Weg bis zum Powershell Seminar "Powershell für Fortgeschrittene". Ich versuch mich gerade wieder fit zu bekommen. Schwierig, ich muss erst mal wieder durchsteigen. Die Verkürzungen in Powershell machen das ja auch kompliziert. Darf ich mit weiteren Fragen auf Euch zukommen?

Link to post
  • Solution

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 to post
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:

  • Like 1
Link to post
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.

  • Like 1
Link to post

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 to post
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 to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...