Magia splattingu

ps-plamaJedną z moich ulubionych funkcji w PowerShellu jest splatting (nie podejmuję się tłumoczenia) – możliwość przekazywania parametrów do poleceń za pomocą tablicy skrótów. Przydaje się to w różnych sytuacjach – ja skupię się na kilku z nich. Przede wszystkim – uruchamianie poleceń z licznymi i przydługimi parametrami. Po drugie – współdzielenie parametrów pomiędzy całą grupą poleceń, które parametry te współdzielą. Wreszcie przekazywanie poleceń z “rodzica” do “potomstwa” z wykorzystaniem zmiennej wbudowanej PSBoundParameters.

Oczywiście, z funkcji tej korzystać będziemy przede wszystkim w skryptach lub funkcjach. W konsoli wszystko wyglądać będzie inaczej. Jeśli uruchamiamy polecenie o długiej nazwie z całą masą parametrów, to zwykle wystarczy skorzystać z aliasów, parametrów pozycyjnych, czy skróconych nazw parametrów – wszystkiego, czego w kodzie produkcyjnym powinniśmy unikać. Jeśli zamierzamy współdzielić parametry, to skorzystać możemy PSDefaultParameterValues. A potomstwa w tej sytuacji zwykle się nie spodziewamy, więc i ta opcja nam “odpada”.

Na początek – kosmetyka. Kod o wiele przyjemniej analizuje się wtedy, gdy przy jego przeglądaniu nie musimy ciągle używać poziomego “suwaka”. Jeśli zechcemy się zastosować do dobrych praktyk dla autorów skryptów i modułów, to bez zastosowania splattingu może się okazać, że długie linie kodu będą nieuniknione. Dla przykładu: ta sama lina, która pobiera informację z rejestru systemowego. Najpierw na skróty, w sposób akceptowalny w konsoli. Dalej – to samo polecenie, w linii tak szerokiej jak to tylko możliwe. Wreszcie – wersja z wykorzystaniem splattingu:

gpv HKLM:\SYSTEM\CurrentControlSet\Services\WSearch ImagePath -EA 0
Get-ItemPropertyValue -LiteralPath HKLM:\SYSTEM\CurrentControlSet\Services\WSearch -Name ImagePath -ErrorAction Stop
$parametry = @{
LiteralPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\WSearch'
Name = 'ImagePath'
ErrorAction = 'Stop'
}
Get-ItemPropertyValue @parametry

Oczywiście, bywają przypadki bardziej skrajne, gdy parametrów jest zdecydowanie więcej i każdy z nich z osobna wystarczyłby, by zmusić nas do “przewijania” kodu w tę i z powrotem.

Drugi przypadek będzie dość częsty wszędzie tam, gdzie wykonywać będziemy kilka podobnych poleceń, z bardzo zbliżoną składnią lub wręcz to samo polecenie kilka razy z niewielkimi zmianami. Dla przykładu – pobierając kilka informacji ze zdalnego serwera z wykorzystaniem polecenia Get-CimInstance:

$sesja = New-CimSession -ComputerName test -Credential $mojePoświadczenia
$wspólne = @{
CimSession = $sesja
ErrorAction = 'Stop'
}
try {
$os = Get-CimInstance @wspólne -ClassName Win32_OperatingSystem
$cs = Get-CimInstance @wspólne -ClassName Win32_ComputerSystem
} catch {
# obsługa błędów...
}
view raw Wspóle.ps1 hosted with ❤ by GitHub

Trzeci przypadek znajdzie zastosowanie zawsze wtedy, gdy tworzyć będziemy polecenie “opakowujące” inne polecenia. Znów, wrócić możemy do sytuacji poprzedniej, tym razem po prostu wykorzystując automatycznie tworzoną zmienną PSBoundParameters, po uprzednim “oczyszczeniu” jej z parametrów, które nam potrzebne nie będą:

function Export-CimInfo {
param (
[String]$Path,
[pscredential]$Credential,
[String]$ComputerName
)
$PSBoundParameters.Remove('Path')
# Przekazujemy tylko ComputerName/ Credential
$sesja = New-CimSession @PSBoundParameters
# ...
$info | Export-Clixml -Path $Path
}

Oczywiście, nic nie stoi na przeszkodzie by ze splattingu korzystać również w innych sytuacjach. Przykładowo: zdarza mi się łączyć z testową i produkcyjną wersją platformy PowerShell Universal, ale wiele parametrów między obiema będę chciał łączyć. Z drugiej strony – nie chce mi się za każdym razem pisać nazwy parametru, który będzie się różnił (Uri). Mogę więc utworzyć trzy niewielkie tablice skrótów i pracować w konsoli nieco wygodniej:

$wspólne = @{
ContentType = 'application/x-www-form-urlencoded'
UseDefaultCredentials = $true
}
$test = @{
Uri = 'https://psu-test.contoso.com/api'
}
$prod = @{
Uri = 'https://psu.contoso.com/api'
}
irm @wspólne @test
irm @wspólne @prod

Wszystko to sprawia, że nie wyobrażam sobie pracy z PowerShellem bez splattingu.

~ - autor: Bartek Bielawski w dniu 10 kwietnia, 2022.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s

 
%d blogerów lubi to: