ceratull 0 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 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. :-( Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 Kennst du die "Expressions" schon? https://docs.microsoft.com/en-us/powershell/scripting/samples/selecting-parts-of-objects--select-object-?view=powershell-7.1 1 Zitieren Link zu diesem Kommentar
ceratull 0 Geschrieben 7. Februar 2021 Autor Melden Teilen Geschrieben 7. Februar 2021 vor 5 Minuten schrieb Dukel: Kennst du die "Expressions" schon? https://docs.microsoft.com/en-us/powershell/scripting/samples/selecting-parts-of-objects--select-object-?view=powershell-7.1 Gute Idee. Sieht aber kompliziert aus. Ich versuch es mal einzubauen. Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 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. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 (bearbeitet) 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. bearbeitet 7. Februar 2021 von BOfH_666 1 Zitieren Link zu diesem Kommentar
ceratull 0 Geschrieben 7. Februar 2021 Autor Melden Teilen Geschrieben 7. Februar 2021 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. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 ?? Hab ich was verpasst? Wieso geht's jetzt auf einmal um LogicalDisk? Ich dachte wir wären bei Prozessen? Zitieren Link zu diesem Kommentar
ceratull 0 Geschrieben 7. Februar 2021 Autor Melden Teilen Geschrieben 7. Februar 2021 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^^. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 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. So ... ich muss jetzt erstmal ins Bett. Schlaft gut und träumt was Süßes! 1 Zitieren Link zu diesem Kommentar
ceratull 0 Geschrieben 7. Februar 2021 Autor Melden Teilen Geschrieben 7. Februar 2021 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? Zitieren Link zu diesem Kommentar
Beste Lösung Dukel 455 Geschrieben 7. Februar 2021 Beste Lösung Melden Teilen Geschrieben 7. Februar 2021 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. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 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. 1 Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 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. 1 Zitieren Link zu diesem Kommentar
ceratull 0 Geschrieben 7. Februar 2021 Autor Melden Teilen Geschrieben 7. Februar 2021 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. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2021 Melden Teilen Geschrieben 7. Februar 2021 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 .... 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ß Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.