Powershell ja käsurea argumendid

Aeg-ajalt on vaja mõnele PowerShelli käsule või skriptile kombineerida käsurea argumentide komplekt.  Võtame näiteks käsu Send-MailMessage:

#requires –Version 2.0
Send-MailMessage -To "meelis@koolitus.ee" -Subject "Powershell saadab meili" -Priority Low –DeliveryNotificationOption Never

Käsurida on küllalt pikk ja siia peaks teatud tingimustel lisama veel hulga argumente.  Seda on lihtne teha luues muutuja, mille sisuks saab käsurea argumentide komplekt.  Näiteks:

#requires –Version 2.0

$mailFrom = "keegi@mees.ee"
$mailSettings = @{
    Subject = "Tähtis teade";
    From = $mailFrom;
    SmtpServer = "mail.mees.ee";
    Encoding = [System.Text.Encoding]::UTF8;
    To = "teine@mees.ee";
    UseSSL = $false
}

Send-MailMessage @mailSettings

Nii on juba mõnevõrra parem.  Käsk ise on lühem ja loetavam ning lisaks saab boonusena käsurea argumentide komplekti käigult muuta (või uusi argumente lisada):

$mailBody = "This is e-mail sent by Powershell"
$mailSettings.To = $userMail
$mailSettings.Add("Body",$mailBody)
if ((get-date).year -eq 2012) {
    $mailSettings.Add("DeliveryNotificationOption", [System.Net.Mail.DeliveryNotificationOptions]::OnSuccess)
}

Send-MailMessage @mailSettings

Nii saab näiteks kogu meilisaatmise panna tsüklisse, mille tulemusel tekib järjekordne masspostituse mootor. Järgneva näite jaoks eeldame, et meil on failis mailusers.csv inimesed, kellele tahame meili saata, nii et iga inimese kohta on olemas tema nimi (veerg Name) ja e-maili aadress (veerg Mail):

$users = import-csv .\mailusers.csv
foreach ($user in $users) {
    $mailSettings.Body = ("Kallis {0}, `n Meil on Sulle superpakkumine" –f $user.Name)
    $mailSettings.To = $user.Mail
    Send-MailMessage @mailSettings
}

Positiivne on see, et sama meetodit saab kasutada kõigi Powershelli käskude ja isekirjutatud skriptide korral:

function minu ($a, $b) {
  $a
  $b
}

$argList = @{
  a = "üks";
  b = 2
}

minu @argList

Õnnetuseks ei saa sama meetodit kasutada muude programmide väljakutsumise juures.  Seal aitab välja vana hea Start-Process:

#requires –Version 2.0
$argList = "www.ee", "-n 3"
$argList += "-l 100"
Start-Process "ping" -ArgumentList $argList -Wait
Advertisements