PowerShell kotiček – PowerShell delovni tokovi

Delovni tok (PowerShell workflow) je zaporedje vnaprej definiranih, povezanih  korakov/ aktivnosti, ki pripeljejo do želenega rezultata.

Prednost toka pred običajno skripto je v zmožnosti sočasnega izvajanja opravil na različnih sistemih.

Powershell Workflow je običajno Powershell skripta, prevedena v Extensible Application Markup Language (XAML), katerega nato sprocesira Windows Workflow Foundation pogon.

Pisanje in zagon delovnega toka je zelo podobno pisanju in uporabi PowerShell funkcij, s tem, da tu uporabimo ključno besedo Workflow, kateri sledi telo skripte oklenjeno v zavite oklepaje:

Workflow Test-Workflow
{
    »Hello World«
}

Delovni tok je zgrajen okrog koncepta aktivnosti. Vsak PowerShell ukaz, ki ga zaženemo znotraj delovnega toka je samostojna, neodvisna aktivnost. Ker je delovni tok lahko zaustavljen in ponovno sproščen, moramo na to računati pri vsakem ukazu. Spremenljivke, kreirane z enim ukazom, ne bodo nujno dosegljive naslednjemu.

Workflow Test-Workflow {
    $obj = New-Object -TypeName PSObject
    $obj | Add-Member -MemberType NoteProperty `
                      -Name ExampleProperty `
                      -Value 'Hello!'
    $obj | Get-Member
}
Test-Workflow

Ker ukaz, kjer objekt nadgrajujemo z add-member metodo, teče v svojem spominskem prostoru, se spremembe na njem ne bodo odražale v spremenljivki $obj v tretjem ukazu. Če želimo le-to doseči pa si lahko pomagamo z zaobjetjem vseh treh ukazov z ukazom InlineScript.

workflow Test-Workflow {
 
    InlineScript {
        $obj = New-Object -TypeName PSObject
        $obj | Add-Member -MemberType NoteProperty `
                          -Name ExampleProperty `
                          -Value 'Hello!'
        $obj | Get-Member
    }
}

V InlineScript blok sicer lahko prenesemo spremenljivko, a moramo pri tem uporabiti $Using modifikator.

Workflow Stop-MyService
{
    $ServiceName = "MyService"

    $Output = InlineScript {
        $Service = Get-Service -Name $Using:ServiceName
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Ena od prednosti uporabe delovnih tokov je možnost, da poganjamo ukaze paralelno namesto običajnega sekvenčnega (zaporednega) načina. To dosežemo z uporabo ukaza Parallel.

Parallel
{
    <aktivnost1>
    <aktivnost2>
}
<aktivnost3>

V zgornjem primeru se aktivnost1 in aktivnost2 začneta hkrati in tečeta vzporedno, aktivnost3 pa se zažene šele ko se obe, 1 in 2, končata.

Primer uporabe paralelnosti je recimo skripta za kopiranje datotek na več računalnikov, ki običajno zgleda takole:

Copy-Item -Path C:\datoteka1.txt -Destination \\racunalnik1\datoteka1.txt
Copy-Item -Path C:\datoteka2.txt -Destination \\racunalnik2\datoteka2.txt
Copy-Item -Path C:\datoteka3.txt -Destination \\racunalnik3\datoteka3.txt

Z uporabo paralelnega delovnega toka spišemo takole:

Workflow Copy-Files
{
    Parallel
    {
        Copy-Item -Path "C:\datoteka1.txt" -Destination "\\racunalnik1"
        Copy-Item -Path "C:\datoteka2.txt" -Destination "\\racunalnik2"
        Copy-Item -Path "C:\datoteka3.txt" -Destination "\\racunalnik3"
    }

    Write-Output "Skopirano."
}

Sporočilo bomo prejeli šele, ko bodo vse tri datoteke skopirane.

Zgornji primer pa lahko uporabimo za prikaz ForEach – Parallel konstrukta.

Workflow Copy-Files
{
    $files = @("C:\ datoteka1.txt", "C:\datoteka2.txt", "C:\ datoteka3.txt")

    ForEach -Parallel -ThrottleLimit 10 ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\racunalnik1
        Write-Output "$File skopiran."
    }

    Write-Output "Vse datoteke so skopirane«
}

Na voljo imamo tudi konstrukt Checkpoint-Workflow, katerega lahko uporabimo za ukazi, za katere ne želimo, da se ob prekinitvah ali napakah, ponovijo. Checkpoint namreč poskrbi za posnetek trenutnega stanja delovnega toka, trenutnih vrednosti njegovih spremenljivk in ves izhod generiran do te točke v poteku. Delovni tok bo po napaki ali prekinitvi vedno nadaljeval od zadnjega checkpointa.

V primeru zgornje skripte, še posebej če bi šlo za zelo velike datoteke, bi bilo Checkpoint-Workflow smiselno uporabiti po ukazu Copy-Item.

Dodaj odgovor

Vaš e-naslov ne bo objavljen. * označuje zahtevana polja