Parancsfájl-munkafolyamatok írása

 

Érvényes: Windows Server 2012, Windows Server 2012 R2

A szakasz témakörei ismertetik a munkafolyamatok Windows PowerShell® parancsnyelvben történő írásának módját. A Windows PowerShell keretrendszerben ugyanebben a nyelvben írhatók függvények és parancsfájlok. A saját munkafolyamatokat futtathatja a parancssorban, illetve parancsfájlokba vagy parancsfájl-modulokba foglalhatja őket.

A Windows Workflow Foundation natív nyelvével, az XAML nyelvvel írt munkafolyamatokkal kapcsolatos további információért lásd az MSDN Library Windows PowerShell-munkafolyamat írása című cikkét.

Munkafolyamatok tervezése

A Windows PowerShell-munkafolyamat egy hatékony megoldás, amely minden futtatáskor adatokat gyűjt több száz számítógépről, és módosítja azokat. Egyszerű és hatékony munkafolyamatterveket készíthet. Vegye figyelembe, hogy a munkafolyamat önmaga vagy a felhasználók által felfüggeszthető, számos, egyetlen kiszolgálóoldali folyamathoz csatlakozó PSSession által vezérelhető, képes túlélni az újraindításokat, magában foglalhat párhuzamosan futó parancsokat és funkciókat, valamint minden parancs saját munkamenettel rendelkezik.

Használja az alábbi tervezési irányelveket

  • Ha még nem ismeri a munkafolyamatokat, akkor tekintse át a szakasz referencia-témaköreit, beleértve a A parancsfájl-munkafolyamatok és a parancsfájlok közötti szintaktikai eltérések fejezetet is.

  • Kezdje azzal, hogy számba veszi a munkafolyamat által végrehajtott feladatokat. Jelölje meg azokat a szakaszokat, amelyek párhuzamosan futhatnak vagy nem kell egy előre meghatározott sorrendben futniuk. Ezeken a szakaszokon belül jelöljön meg minden olyan részt, amelyeknek egymás utáni sorrendben kell futniuk.

  • A feladatokat rendezze a munkafolyamaton belüli függvényekké. Minden feladat esetén egy meglévő Windows PowerShell-parancsmag segítségével hozhat létre új parancsokat, illetve adhat hozzá ellenőrzési pontot a kritikus lépések után.

  • A munkafolyamatokat úgy tervezték, hogy több célszámítógépen is fussanak. Nem kell távoli munkameneteket létrehoznia, vagy olyan távoli parancsokat használnia, amelyek például az Invoke-Command parancsmagot használják a munkafolyamatban.

  • Ahogy minden más, több számítógépen futó parancsfájl esetén, itt is vegye figyelembe a számítógépek közötti eltéréseket, amelyek hatással lehetnek a parancsfájl működésére, beleértve a különböző operációs rendszereket, eszközöket, a fájlrendszer elrendezését, a környezeti változókat és a Windows PowerShell verzióit.

  • Tervezze meg előre a munkafolyamat súgótémaköreit. Nyilvántarthatja a felhasználók számára közzétenni kívánt információkat, beleértve a munkafolyamat kívánt architektúráját, a munkamenet kívánt konfigurációs jellemzőit és engedélyeit.

Munkafolyamatokat olyan parancsfájl-szerkesztőkkel írhat, mint például a Windows PowerShell integrált parancsfájl-kezelési környezet (ISE), amely érvényesíti a munkafolyamat szintaxisát, és kiemeli a szintaxishibákat. A parancsfájlok és munkafolyamatok közötti szintaktikai különbség jelentős, ezért a munkafolyamatokat és a parancsfájlokat is ismerő eszközökkel sok kódolási és tesztelési idő takarítható meg.

A munkafolyamatokhoz jól alkalmazható tevékenységekről a A Windows PowerShell munkafolyamat - első lépések témakör „A munkafolyamatok és a Windows PowerShell-parancsfájlok különbségei” részében talál további információt.

A munkafolyamat kulcsszavai

Kezdje a workflow kulcsszóval, amely a munkafolyamat parancsát az alábbihoz azonosítja: Windows PowerShell. A workflow kulcsszó a parancsfájl-munkafolyamatokban szükséges. A munkafolyamat neve a workflow kulcsszót követi. A munkafolyamat törzse kapcsos zárójelek között van.

Az alábbiakban található a Workflow kulcsszó szintaxisdiagramja.

workflow Test-Workflow
{
    ...
}

További információ a Windows PowerShell parancsnyelv kulcsszavairól: about_Language_Keywords.

A munkafolyamatok és munkafolyamat-elemek elnevezése

A munkafolyamat egy Windows PowerShell-parancstípus. Válasszon egy ige-főnév formátumú nevet. A Get-Verb-parancsmag és az A Windows PowerShell-parancsok jóváhagyott műveletei súgótémakör alapján választhat egy jóváhagyott műveletet a névhez. A Windows PowerShell egy figyelmeztetést hoz létre, ha jóváhagyott műveleteket nem tartalmazó parancsokat importál a modulból. A munkafolyamat munkamenetbe való importálása során fellépő parancsnévütközések elkerülése érdekében szükség szerint használjon leíró főnevet és főnévi előtagot.

A munkafolyamatok paraméter- és változónevei csak betűket, számokat, a kötőjel (-) és az aláhúzás (_) karaktereket tartalmazhatják. A paraméternevekben kerülje a kötőjel használatát, mivel a munkafolyamatban és a munkafolyamat felé irányuló hívásokban minden kötőjellel ellátott paraméternevet zárójelbe kell foglalni. Ne használja az általános munkafolyamat-paraméterek neveit, a munkafolyamat futtatási változóit vagy egyéb foglalt szavakat, például a „workflow” és a „parallel” kifejezéseket.

A munkafolyamat futtatási paramétereiről az MSDN Library PSWorkflowRuntimeVariable Enumeration című súgótémakörében talál további információt.

A foglalt szavakkal kapcsolatos további információért lásd a A parancsfájl-munkafolyamatok és a parancsfájlok közötti szintaktikai eltérések, illetve az about_Reserved_Words fejezetek „Foglalt szavak a munkafolyamatokban” című részét.

Paraméterek hozzáadása a munkafolyamatokhoz

Paramétereket a Param kulcsszó és az opcionális Parameter attribútum segítségével adhat hozzá a munkafolyamathoz. Ez a módszer megegyezik a paraméterek függvényekhez való hozzáadásának módszerével.

A következő kódblokkok a Param kulcsszó és a Parameter attribútum szintaxisát ábrázolják a parancsfájl-munkafolyamatban.

workflow Test-Workflow
{
param ([Type]$<ParameterName>)
}

workflow Test-Workflow
{
    Param
    (
        [Parameter(Mandatory=<$True | $False>)]
        [<Type>]
        $<ParameterName>
    )
}

A ConfirmImpact, DefaultParameterSetName, HelpUri és SupportsShouldProcess attribútumokat a CmdletBinding attribútum segítségével adhatja meg.

A következő kódblokk a CmdletBinding attribútumot használó minta munkafolyamat szintaxisát ábrázolja.

workflow Test-Workflow
{   
    [CmdletBinding(ConfirmImpact=<String>,
        DefaultParameterSetName=<String>,
        HelpURI=<URI>,
        PositionalBinding=<Boolean>)]

    Param
    (
        [parameter(Mandatory=$true)]
        [String[]]
        $<ParameterName>
    )
}

Nem szükséges általános munkafolyamat-paramétereket hozzáadnia a munkamenethez. A Windows PowerShell-munkafolyamat általános paramétereket és általános munkafolyamat-paramétereket ad hozzá minden munkafolyamathoz, beleértve a CmdletBinding vagy a Parameter attribútumokat nem tartalmazó egyszerű munkafolyamatokat is.

A függvényekben és munkafolyamatokban lévő paraméterekről a következő súgótémakörökben talál további információt.

Tevékenységek hozzáadása a munkafolyamathoz

A tevékenység a munkafolyamat alapvető munkaegysége. A munkafolyamatban használt minden parancs és kifejezés tevékenységként fut. A Windows PowerShell-munkafolyamatokban a tevékenységek a parancsmagokhoz hasonlóan működnek. A tevékenységek futtatásához írja be a tevékenység nevét, majd a paramétereit. A Windows PowerShell-munkafolyamatok a Windows PowerShell számos parancsmagját tevékenységgé alakítják át. Mindössze néhány parancsmag van kizárva. A kizárt parancsmagok listáját a Tevékenységek használata parancsfájl-munkafolyamatokban témakör „Kizárt parancsmagok” részében találja.

A Windows PowerShell fő parancsmagjainak nagy része tevékenységként valósul meg. Munkafolyamatban való használatukhoz egyszerűen adja meg a parancsmag nevét vagy aliasát.

Az alábbi munkafolyamat például tartalmazza a Get-Process tevékenységet.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    gps -Name Winword
}

Ha egy parancsmaghoz nem tartozik tevékenység, és nincs kifejezetten kizárva, akkor a Windows PowerShell-munkafolyamat automatikusan futtatja a parancsmagot a inlineScript tevékenységben, és a kimenetet visszaadja a munkafolyamatnak.

Az alábbi munkafolyamat például a Get-WindowsFeature parancsmagot használja, amely implicit módon fut egy inlineScript tevékenységen belül.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
}

Akár kizárt parancsmagokat is futtathat, mivel azok nincsenek tevékenységekként implementálva, de ezeket egy inlineScript tevékenységen belül kell futtatnia. Az alábbi munkafolyamat például egy inlineScript tevékenység segítségével futtatja a Get-Variable parancsmagot, amely ki van zárva.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

A munkafolyamatokban továbbá kifejezéseket is használhat, beleértve a számtani kifejezéseket és összehasonlító utasításokat is. A Windows PowerShell-munkafolyamat a kifejezéseket egy, külön erre a célra tervezett, speciális tevékenységen belül futtatja.

Az alábbi munkafolyamat például egy kifejezést tartalmaz. Mint minden kifejezés, ez is egy tevékenységen belül fut.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable PSHome }

    320GB / 3MB
}

További információk a tevékenységekről: Tevékenységek használata parancsfájl-munkafolyamatokban.

A tevékenységek paramétereinek használata

A tevékenységek a parancsmagokhoz hasonlóan paraméterekkel rendelkező parancsok. Egy parancsmag tevékenységgé való átalakításakor a szintaxis és a paraméterek változatlanok maradnak. Van néhány kivétel, amelyek a „Tevékenységek a parancsfájl-munkafolyamatokban” című súgótémakörben vannak felsorolva.

A pozícióparaméterek azonban nem érvényesek tevékenységekben, ezért minden paraméternévre szükség van. A paraméter-aliasok és rövidítések használata engedélyezett. Az alábbi minta munkafolyamatban például a Get-Process, a Get-WindowsFeature és a Get-Variable parancsmagok Name paraméterei a parancsokban jelennek meg.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

Ezenkívül a dinamikus paraméterek sem érvényesek a tevékenységekben. Dinamikus paraméterek hívásához zárja a parancsot egy InlineScript tevékenységbe. Az alábbi munkafolyamat például egy, a Get-ChildItem parancsmag CodeSigningCert dinamikus paraméterét használó inlineScript tevékenységet tartalmaz. A Tanúsítványszolgáltató által hozzáadott CodeSigningCert paraméter csak a Cert: meghajtón használható.

workflow Test-Workflow
{
   InlineScript {Get-ChildItem -Path Cert:\CurrentUser -CodeSigningCert}
} 

További információk a inlineScript tevékenységről: Windows PowerShell-parancsok futtatása munkafolyamatokban.

Általános tevékenység-paraméterek használata

A Windows PowerShell-munkafolyamat egy általános tevékenységparaméter-készletet ad hozzá a tevékenységhez. Ezek a paraméterek lehetővé teszik a több számítógépes környezetekben kritikus beállítások megadását.

Egyes általános munkafolyamat-paraméterek általános tevékenység-paraméterek is. Ez a funkció lehetővé teszi, hogy tevékenységspecifikus kivételeket hozzon létre az általános munkafolyamat-paraméterértékek értékeihez. Egy tevékenység PSComputerName paraméterével például a tevékenység csak a kiválasztott számítógépeken fog futni, a PSCredential paraméter segítségével pedig a tevékenységet más hitelesítő adatokkal futtathatja.

Az általános tevékenység-paraméterek nem az összes, de a legtöbb tevékenység esetén érvényesek. Az általános tevékenység-paraméterek például a Suspend-Workflow és Checkpoint-Workflow tevékenységek esetén nem érvényesek. Az általános tevékenységparaméterek ezenkívül nem érhetők el olyan parancsmagok vagy kifejezések esetén, amelyeket a Windows PowerShell-munkafolyamat automatikusan futtat egy tevékenységben. Az általános tevékenységparaméterek a InlineScript tevékenység esetén igen, a InlineScript parancsfájlblokkban lévő parancsok esetén viszont nem érhetők el.

Az alábbi munkafolyamatban lévő tevékenységek általános tevékenységparamétereket használnak, ahol azok érvényesek.

workflow Test-Workflow
{
    Get-Process -Name PowerShell -PSComputerName Server01, Server 12
    InlineScript { Get-Variable -Name PSHome } -PSRunningTimeoutSec 3600

    #No activity common parameters.
    Get-WindowsFeature -Name PowerShell, PowerShell-v2  

    #No activity common parameters.
    320GB / 3MB
}

Az általános tevékenységparaméterekkel kapcsolatos további információért lásd: Tevékenységek használata parancsfájl-munkafolyamatokban.

Általános paraméterértékek lekérése

A Windows PowerShell-munkafolyamat minden munkafolyamathoz hozzáadja a munkafolyamat futásidejű változóit. A munkafolyamat futásidejű változói tartalmazzák az általános paraméterek értékeit, az általános munkafolyamat-paramétereket és egyéb, a munkafolyamat számárra kritikus értékeket.

A változók értékei rendkívül hasznosak. Alaposan tekintse át és használja őket munkafolyamataiban. Egy munkafolyamat futtatásakor például a PSComputerName paraméter tárolja a célszámítógépek neveit, de amikor hozzáfér a munkafolyamat $PSComputerName változójához, akkor a változó annak a számítógépnek a nevét fogja tartalmazni, amelyen a munkafolyamat jelenleg fut.

A munkafolyamatok futásidejű változóival kapcsolatos további információért lásd: PSWorkflowRuntimeVariable változók felsorolása.

A paraméterértékek munkafolyamaton belülről történő eléréséhez használja a változó nevét. Nem kell meghatároznia a változót.

A következő munkafolyamat például a PSConnectionRetryCount általános paraméter értékét használja azáltal, hogy $PSConnectionRetryCount változóként hivatkozik rá.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

Az alábbi példa azt mutatja be, hogy amikor a munkafolyamat futtatása közben a PSConnectionRetryCount paramétert használja, akkor a paraméter értéke látható a munkafolyamatban.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

A munkafolyamat futtatási és általános paraméterértékeinek módosításához használja a Set-PSWorkflowData tevékenységet.

Az alábbi munkafolyamat például egy olyan parancsot tartalmaz, amely módosítja a PSConnectionRetryCount értékét.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

A Windows PowerShell-munkafolyamat változóival kapcsolatos további információért lásd az alábbi súgótémaköröket.

Futtatási változók és általános paraméterértékek lekérése

A Windows PowerShell-munkafolyamat minden munkafolyamathoz hozzáadja a munkafolyamat futásidejű változóit. A munkafolyamat futásidejű változói tartalmazzák az általános paraméterek értékeit, az általános munkafolyamat-paramétereket és egyéb, a munkafolyamat számárra kritikus értékeket.

A változók értékei rendkívül hasznosak. Alaposan tekintse át és használja őket munkafolyamataiban. Egy munkafolyamat futtatásakor például a PSComputerName paraméter tárolja a célszámítógépek neveit, de amikor hozzáfér a munkafolyamat $PSComputerName változójához, akkor a változó annak a számítógépnek a nevét fogja tartalmazni, amelyen a munkafolyamat jelenleg fut.

A munkafolyamatok futásidejű változóival kapcsolatos további információért lásd: PSWorkflowRuntimeVariable változók felsorolása.

A paraméterértékek munkafolyamaton belülről történő eléréséhez használja a változó nevét. Nem kell meghatároznia a változót.

A következő munkafolyamat például a PSConnectionRetryCount általános paraméter értékét használja azáltal, hogy $PSConnectionRetryCount változóként hivatkozik rá.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

Az alábbi példa azt mutatja be, hogy amikor a munkafolyamat futtatása közben a PSConnectionRetryCount paramétert használja, akkor a paraméter értéke látható a munkafolyamatban.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

A munkafolyamat futtatási és általános paraméterértékeinek módosításához használja a Set-PSWorkflowData tevékenységet.

Az alábbi munkafolyamat például egy olyan parancsot tartalmaz, amely módosítja a PSConnectionRetryCount értékét.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

A Windows PowerShell-munkafolyamat változóival kapcsolatos további információért lásd az alábbi súgótémaköröket.

Parancsfájlok futtatása egy munkafolyamatban

Egy parancsfájl (.ps1 fájl) munkafolyamatban való futtatásához foglalja a parancsfájl hívását egy InlineScript tevékenységbe. Más parancsokhoz és tevékenységekhez hasonlóan a parancsfájl a munkafolyamatban szereplő minden célszámítógépen fut, és a kimenetet visszaadja a munkafolyamatnak

Az alábbi munkafolyamat például egy parancsfájlt futtató InlineScript tevékenységet tartalmaz. A parancsfájl egy megosztott könyvtárban található. A munkafolyamat a parancsfájl lefutásakor a PSPersist tevékenységparaméter segítségével egy ellenőrzőpontot hoz létre.

workflow Test-Workflow
{
   $AssetData =InlineScript {\\Server01\Share01\Get-AssetData.ps1 -All} -PSPersist
   ...
}

A munkafolyamatokat több számítógépen való futtatásra tervezték, ezért a relatív elérési út helyett használja a parancsfájl abszolút elérési útját.

Parancsok párhuzamos futtatása

A Parallel és a ForEach -Parallel kulcsszavak a parancsok egyidejű és nem meghatározott sorrendben történő futtatásával optimalizálják a munkafolyamatot. A Sequence kulcsszó egymás után futtatja a kiválasztott parancsokat egy Parallel parancsfájlblokkon belül. Ezek a kulcsszavak csak a munkafolyamaton belül érvényesek. Beágyazott munkafolyamatok esetén igen, a munkafolyamatok beágyazott függvényei esetén viszont nem érvényesek. A parancsok alapértelmezés szerint olyan sorrendben futnak, ahogy az egyes parancsok a következő parancs elindítása előtt befejeződnek.

Ahol csak lehet, használja a párhuzamos futtatást, mivel az jelentős teljesítményjavulást eredményezhet, különösen akkor, ha a munkafolyamat több számítógépet vesz célba.

Az alábbi parancs- és tevékenységtípusok jól használhatók párhuzamos futtatáshoz.

  • Az adatokat nem megosztó parancsok, mint például a Get-Process és a Get-Service parancsok.

  • Hasonló elemek gyűjteményein futó parancsok. A legtöbb ForEach utasítás jól használható a ForEach -Parallel használatával való futtatáshoz.

Párhuzamos

A Parallel parancsfájlblokkokban lévő parancsok egyidejűleg is futtathatók. A futtatási sorrendjük nincs meghatározva.

A következő diagram egy, a Parallel kulcsszóval és parancsfájlblokkal rendelkező munkafolyamat szintaxisát jeleníti meg.

workflow Test-Workflow
{
    Parallel
    {
         <Activity>
         <Activity>
...
    }
}

A következő munkafolyamat például egy Parallel parancsfájlblokkot tartalmaz, amely a számítógép folyamatait és szolgáltatásait lekérő tevékenységeket futtat. Mivel a Get-Process és a Get-Service hívásai függetlenek, ezért azok egyidejűleg és bármilyen sorrendben futtathatók.

workflow Test-Workflow
{
    Parallel
    {
         Get-Process
         Get-Service
    }
}

ForEach -Parallel

A ForEach kulcsszó Parallel paramétere a megadott gyűjtemény minden elemén egyszer futtatja egy ForEach parancsfájlblokk parancsait. A gyűjtemény elemeinek feldolgozása párhuzamosan történik. A parancsfájlblokk parancsai egymás után futnak.

A Windows PowerShellForEach utasításához hasonlóan a ($<Collection>) gyűjteményt tartalmazó változókat a ForEach -Parallel utasítás előtt kell meghatározni, de az aktuális elemet ($<item>) jelölő elem a ForEach -Parallel utasításban van meghatározva.

Az alábbiakban a parancs szintaxisa látható.

workflow Test-Workflow
{
    ForEach -Parallel ($<item> in $<collection>)
    {
       <Activity1>
       <Activity2>
 ...
    }
}

A következő munkafolyamat például tartalmaz egy, a Get-Disk tevékenység által lekért lemezeket feldolgozó Foreach -Parallel utasítást. A parancssorblokk parancsai egymás után futnak le, de a lemezeken párhuzamosan futnak.

workflow Test-Workflow
{
    $Disks = Get-Disk
    ForEach -Parallel ($Disk in $Disks)
    {
        $DiskPath = $Disk.Path   
        $Disk | Initialize-Disk
        Set-Disk -Path $DiskPath
    }
}

Sequence

A Sequence kulcsszó egy Parallel parancsfájlblokkon belül egymás után futtat parancsokat. A Sequence parancsfájlblokk más parancsokkal párhuzamosan fut, de a szekvenciális parancsfájlblokkon belül lévő parancsok egymás után, meghatározott sorrendben futnak.

A következő kódblokk egy Sequence parancsfájlblokk szintaxisát tartalmazza. Elképzelhető, hogy a 3. tevékenység az 1. és a 2. tevékenység előtt vagy azokkal egyidejűleg fut, de a 4. tevékenység a 3. tevékenység befejezéséig nem fut le.

workflow Test-Workflow
{
    parallel
    {
       <Activity1>
       <Activity2>

       sequence 
       {
           <Activity3>
           <Activity4>
           ...
       }
        ...
    }
}