Podstawy: cmdlety, pipeline, obiekty
PowerShell napędza on-premowe probe'y ZEUS — skrypty inwentaryzacji LDAP, zbierania performance i forestów AD. Żeby pisać je dobrze, trzeba zrozumieć fundament: PowerShell przesyła obiekty, nie tekst.
Cmdlety — schemat Verb-Noun
Polecenia PowerShell (cmdlety) mają nazwę Czasownik-Rzeczownik. Czasowniki są
ujednolicone (Get, Set, New, Remove, Invoke).
Get-Process
Get-Service -Name WinRM
Get-ADForest -Identity corp.local
Standard ProfessNet: własne funkcje też nazywamy
Verb-Nounz zatwierdzonym czasownikiem (Get-Verbpokazuje listę). Stąd nazwy realnych skryptów ZEUS:Get-LsnForest,Get-LsnInventory,Get-LsnPerf.
Pipeline przesyła obiekty
Najważniejsza różnica wobec basha: | przekazuje obiekty z właściwościami,
a nie linie tekstu. Dlatego można filtrować i sortować po polach.
# filtrowanie po właściwości obiektu, nie po tekście
Get-Service |
Where-Object Status -eq "Running" |
Sort-Object Name |
Select-Object Name, Status
# bash myślałby tekstem; PowerShell zna pole .WorkingSet64
Get-Process |
Where-Object { $_.WorkingSet64 -gt 100MB } |
Select-Object Name, @{ N = "MemMB"; E = { [math]::Round($_.WorkingSet64 / 1MB) } }
$_ (lub $PSItem) to bieżący obiekt w pipeline.
Select, Where, ForEach
| Cmdlet | Rola |
|---|---|
Where-Object | filtruje obiekty po warunku |
Select-Object | wybiera/przekształca właściwości |
Sort-Object | sortuje po polu |
ForEach-Object | wykonuje akcję na każdym obiekcie |
Group-Object | grupuje po wartości pola |
Obiekty wynikowe budujemy jawnie
W skryptach probe'owych ZEUS tworzymy własne obiekty wynikowe przez
[pscustomobject] — to one trafiają potem do JSON-a.
$result = [pscustomobject]@{
Host = $env:COMPUTERNAME
Forest = $forest
Hosts = $hostCount
Scanned = (Get-Date).ToString("o")
}
Czemu to ma znaczenie dla JSON-a
Ponieważ pipeline to obiekty, konwersja do JSON jest trywialna i wierna — pola
obiektu stają się kluczami JSON. To podstawa wzorca -AsJson w probe'ach ZEUS
(zwracamy ustrukturyzowany wynik na stdout, który czyta backend).
$result | ConvertTo-Json -Depth 5 -Compress
Wskazówka: nie buduj JSON-a ręcznie ze stringów (
"{ ""host"":..."). Twórz[pscustomobject]i użyjConvertTo-Json. Ucieczki, typy i zagnieżdżenia załatwia się same.
Pobieranie pomocy
Get-Help Get-Service -Examples
Get-Member -InputObject (Get-Process | Select-Object -First 1)
Get-Member pokazuje, jakie właściwości i metody ma obiekt — bezcenne przy
pisaniu filtrów.
Cmdlety Verb-Noun, pipeline obiektów i [pscustomobject] jako wynik to ABC
PowerShella. Gdy myślisz obiektami, a nie tekstem, skrypty probe'owe stają się
proste, a wyjście JSON — wiarygodne.