PowerShell/01intro10 min

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-Noun z zatwierdzonym czasownikiem (Get-Verb pokazuje 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

CmdletRola
Where-Objectfiltruje obiekty po warunku
Select-Objectwybiera/przekształca właściwości
Sort-Objectsortuje po polu
ForEach-Objectwykonuje akcję na każdym obiekcie
Group-Objectgrupuje 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żyj ConvertTo-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.