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.

Spread the love

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.