jak to często bywa, bardzo-długa-polska-nazwa ma krótki odpowiednik (; „Splatting” to mechanizm, pozwalający na zbudowanie zmiennej hashtable, która zostanie wykorzystana w miejsce tradycyjnych parametrów wywołania. po co?
bardzo często finalne parametry wywołania jakiegoś polecenia zależą od tego, co się wydarzy podczas przetwarzania skryptu. w efekcie często powstają złożone, a czasem wręcz zagnieżdżone, struktury 'if-then-else’ lub 'switch-case’. dodanie kolejnego warunku powoduje, że modyfikacja skryptu staje się nieprzyjemna lub wręcz ryzykowna, bo wymaga ciężkiego przebudowania logiki. splatting eliminuje konieczność budowania takich dziwacznych struktur.
zademonstruję to na prostym przykładzie – założenia użytkownika. taki scenariusz: dostajemy arkusz z listą użytkowników z kilq działów. pewne dane, takie jak telefon czy adres nie są obligatoryjne i czasem są a czasem nie. w przypadq 'new-ADUser’ splatting nie pokazuje prawdziwej mocy, ponieważ większość parametrów przyjmuje '$null’ jako wartość, więc przy stałym finalnym wywołaniu, polecenie nie spowoduje błędów. ale to tylko trening:
New-ADUser -Name "test" -Path "ou=tests,dc=domain,dc=lab" -GivenName test -Surname delme -Company LU -Title szeregowiec -City "wąchock" -Country PL -Department IT -HomePhone $null -HomeDrive $null -HomeDirectory $null -MobilePhone $null
jest wiele poleceń, które nie będą takie przyjemne, i $null zostanie zaakceptowany lub wręcz będzie miał jakieś znaczenie. jak zatem pozbyć się takich pustych parametrów podczas przetwarzania i zbudować dynamiczną listę wywołania?
#jakiś tam import gdzie są różne informacje o nowych człowiekach $users=import-csv -delimiter ';' -Path userFromHR.csv -encoding default foreach($user in $users) { #zakładam hashtable, do którego będą zrzucane parametry wywołania. #przy okazji zakładam, że firma to zawsze 'logicunion' a standardową ścieżką jest jakiś kontener. $newUser=@{ company='LogicUnion' path="ou=users,ou=central,dc=domain,dc=lab" } $newUser.Add('AccountPassword',(ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force) ) $newUser.Add('EmailAddress',$user.Email) #teraz kilka prostych ifów które rozbudują ilość parametrów tylko jeśli będą miały jakąś wartość if($user.mobile) { $newUser.Add('mobilePhone',$user.mobile) } if($user.phone) { $newUser.Add('homePhone',$user.phone) } if($user.department -match 'hr' -or $user.department -match 'sales') { $newUser.Add('homeDrive','y:') } #no i clue - przekazanie zmiennej jako parametrów czyli SPLATTING New-ADUser @newUser }
dwie ważne rzeczy:
- przy przekazywaniu tablicy jako parametrów używa się 'at’ @ zamiast dolara '$’. dość wyjątkowe użycie – trzeba zapamiętać.
- splatting można wykorzystać nawet tam, gdzie commandlet/funkcja nie ma zdefiniowanego przyjmowania wartości 'by value’. czyli można zawsze – to modyfikacja interpretacji polecenia a nie jego właściwego wykonania.
function test { param( [string]$str,[int]$i ) echo "$str $i" } $params=@{ str='abc' i=10 } test @params
eN.