for(){$p=(gps|Sort-Object -D CPU|Select -First ($Host.UI.RawUI.WindowSize.Height-4)|Out-String).trim();cls;""+(date);$p;sleep 1} - *nixowy top w Powershellu
Powyższy oneliner uruchomi coś, co może przypominać znaną z systemów Unix/Linux komendę top, wyświetlającą listę procesów w trybie tekstowym.
Przyglądając się mu bliżej:
Dla wygody moglibyśmy sobie to zamknąć w funkcji np. o nazwie pstop:
function pstop() { for(){$p=(gps|Sort-Object -D CPU|Select -First ($Host.UI.RawUI.WindowSize.Height-4)|Out-String).trim();cls;""+(date);$p;sleep 1} }
By następnie ją wywołać po prostu pisząc pstop.
Żeby było to dostepne zawsze pod ręką, możemy tę funkcję wkleić do pliku profilowego, np. tworząc go lub edytując za pomocą notepad $PROFILE (tutaj w przypadku Wiindowsa musimy jednak pamiętać o polityce uruchamiania skryptów, możliwe, że przyda się wykonać Set-ExecutionPolicy -Scope CurrentUser RemoteSigned).
Jak to działa — krok po kroku
Rozłóżmy onelinera na czynniki pierwsze:
for() { ... }
nieskończona pętla,
$p=gps
pobierz listę procesów wykorzystując gps będący aliasem na Get-Process, wynik zapisz do zmiennej $p,
Sort-Object -D CPU
sortuj procesy po użyciu procesora (CPU) malejąco (-Descending, w skrócie -D); pod Windowsem można by było wykorzystać alias, pisząc sort -D,
Select -First ($Host.UI.RawUI.WindowSize.Height-4)
wybierz tyle pierwszych wyników, ile ma wysokość terminala bez 4 linii,
.trim()
usuń białe znaki na końcach wierszy,
cls
wyczyść cały ekran,
""+(date);$p
wyświetl aktualną datę a następnie listę procesów,
sleep 1
zaśnij na sekundę.