Scrittura di un flusso di lavoro di script

 

Si applica a: Windows Server 2012, Windows Server 2012 R2

Gli argomenti di questa sezione illustrano come scrivere un flusso di lavoro nel linguaggio di scripting di Windows PowerShell®, lo stesso che si usa per scrivere funzioni e script in Windows PowerShell. Dopo averli scritti, è possibile eseguire i flussi di lavoro dalla riga di comando oppure includerli in script o in moduli di script.

Per informazioni su come scrivere flussi di lavoro in XAML, il linguaggio nativo di Windows Workflow Foundation, vedere Scrittura di un flusso di lavoro di Windows PowerShell in MSDN Library.

Pianificazione di un flusso di lavoro

Il flusso di lavoro di Windows PowerShell è una potente soluzione che consente di raccogliere dati e apportare modifiche in centinaia di computer a ogni esecuzione. Pianificare il progetto di flusso di lavoro puntando all'efficienza e alla semplicità. Il flusso di lavoro può essere sospeso automaticamente o dagli utenti, può essere controllato da numerose sessioni di Windows PowerShell (PSSession) connesse a un singolo processo sul lato server, può rimanere attivo dopo i riavvii e può includere comandi e funzioni eseguiti in parallelo. Inoltre, ogni comando viene eseguito in una specifica sessione.

Usare le linee guida seguenti per la pianificazione:

  • Se è la prima volta che si usano i flussi di lavoro, vedere gli argomenti di riferimento di questa sezione, tra cui Differenze sintattiche tra flussi di lavoro degli script e gli script.

  • Per iniziare, enumerare le attività che verranno eseguite dal flusso di lavoro. Contrassegnare le sezioni che possono essere eseguite simultaneamente o che non richiedono un ordine di esecuzione predeterminato. All'interno di queste sezioni contrassegnare quelle che devono essere eseguite in ordine sequenziale.

  • Organizzare le attività in funzioni all'interno del flusso di lavoro. Per ogni attività, usare un cmdlet di Windows PowerShell esistente o creare un nuovo comando e aggiungere un checkpoint dopo ogni passaggio cruciale.

  • I flussi di lavoro sono progettati per essere eseguiti in più computer di destinazione. Non è necessario creare sessioni remote o usare comandi remoti, come quelli che usano il cmdlet Invoke-Command cmdlet, nel flusso di lavoro.

  • Come per qualsiasi script eseguito in più computer, valutare le variazioni tra computer che potrebbero influire sul funzionamento dello script, ad esempio differenze di sistemi operativi, dispositivi, organizzazione del file system, variabili di ambiente e versioni di Windows PowerShell.

  • Pianificare in anticipo gli argomenti della Guida per il flusso di lavoro. Tenere traccia delle informazioni che è necessario comunicare agli utenti, tra cui architettura preferita del flusso di lavoro, caratteristiche di configurazione preferite per le sessioni e autorizzazioni.

Per scrivere il flusso di lavoro, usare un editor di script, ad esempio Windows PowerShell Integrated Scripting Environment (ISE), che applica la sintassi del flusso di lavoro ed evidenzia gli errori di sintassi. Le differenze sintattiche tra script e flussi di lavoro sono significative, quindi uno strumento che riconosce sia gli uni che gli altri consentirà di risparmiare una quantità significativa di tempo per la scrittura di codice e i test.

Per altre informazioni sulle attività particolarmente indicate per i flussi di lavoro, vedere la sezione sulle differenze tra flussi di lavoro e script di Windows PowerShell in Informazioni sul flusso di lavoro di Windows PowerShell.

Parola chiave workflow

Iniziare con la parola chiave workflow, che identifica un comando del flusso di lavoro per Windows PowerShell. La parola chiave workflow è necessaria in un flusso di lavoro di script. Il nome del flusso di lavoro segue la parola chiave workflow. Il corpo del flusso di lavoro è racchiuso tra parentesi graffe.

Di seguito è riportato il diagramma della sintassi per la parola chiave Workflow.

workflow Test-Workflow
{
    ...
}

Per altre informazioni sulle parole chiave nel linguaggio di scripting di Windows PowerShell, vedere about_Language_Keywords.

Assegnazione di nomi a flussi di lavoro e relativi elementi

Un flusso di lavoro è un tipo di comando di Windows PowerShell. Selezionare un nome con il formato verbo-nome. Usare il cmdlet Get-Verb e vedere l'argomento della guida Verbi approvati per i comandi di Windows PowerShell per selezionare un verbo approvato per il nome.Windows PowerShell genera un avviso quando vengono importati da un modulo comandi che non includono verbi approvati. Usare un nome descrittivo e un prefisso, se necessario, per evitare conflitti di nomi di comando quando il flusso di lavoro viene importato in una sessione.

I nomi di parametri e variabili dei flussi di lavoro possono includere solo lettere, numeri, trattini (-) e caratteri di sottolineatura ( _ ). Evitare di usare il trattino nei nomi di parametro, perché ogni nome di parametro con trattini nel flusso di lavoro e nelle chiamate al flusso di lavoro deve essere racchiuso tra parentesi graffe. Non usare i nomi di parametri comuni del flusso di lavoro, variabili di runtime del flusso di lavoro o altre parole riservate, come "workflow" e "parallel".

Per altre informazioni sui parametri di runtime dei flussi di lavoro, vedere l'argomento della Guida Enumerazione PSWorkflowRuntimeVariable in MSDN Library.

Per altre informazioni sulle parole riservate, vedere la sezione relativa alle parole riservate nei flussi di lavoro in Differenze sintattiche tra flussi di lavoro degli script e gli script e l'argomento about_Reserved_Words.

Come aggiungere parametri in un flusso di lavoro

Per aggiungere parametri in un flusso di lavoro, usare la parola chiave Param con l'attributo Parameter facoltativo. Queste tecniche sono identiche a quelle che si usano per aggiungere parametri in una funzione.

I blocchi di codice seguenti mostrano la sintassi della parola chiave Param e dell'attributo Parameter in un flusso di lavoro di script.

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

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

È anche possibile usare l'attributo CmdletBinding per specificare gli attributi ConfirmImpact, DefaultParameterSetName, HelpUri e SupportsShouldProcess.

Il blocco di codice seguente mostra la sintassi di un flusso di lavoro di esempio che usa l'attributo CmdletBinding.

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

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

Non è necessario aggiungere parametri comuni del flusso di lavoro al flusso di lavoro. Il flusso di lavoro di Windows PowerShell aggiunge i parametri comuni e i parametri comuni del flusso di lavoro a tutti i flussi di lavoro, compresi quelli semplici che non hanno l'attributo CmdletBinding o Parameter.

Per altre informazioni sui parametri in funzioni e flussi di lavoro, vedere gli argomenti della Guida seguenti.

Come aggiungere attività in un flusso di lavoro

L'attività è l'unità di lavoro di base di un flusso di lavoro. Ogni comando ed espressione che si usa in un flusso di lavoro viene eseguito come attività. Nel flusso di lavoro di Windows PowerShell un'attività è molto simile a un cmdlet. Per eseguire un'attività, immettere il relativo nome seguito dai parametri. Il flusso di lavoro di Windows PowerShell converte molti dei cmdlet inclusi in Windows PowerShell in attività. Esiste solo un set ridotto di cmdlet esclusi. Per l'elenco di cmdlet esclusi, vedere la sezione corrispondente in Uso delle attività nei flussi di lavoro di script.

La maggior parte dei cmdlet di sistema di Windows PowerShell è stata implementata come attività. Per usarli in un flusso di lavoro, immettere il nome o l'alias del cmdlet.

Ad esempio, il flusso di lavoro seguente include l'attività Get-Process.

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

Se un cmdlet non ha un'attività corrispondente e non è esplicitamente escluso, il flusso di lavoro di Windows PowerShell lo esegue automaticamente nell'attività inlineScript e restituisce l'output al flusso di lavoro.

Ad esempio, il flusso di lavoro seguente usa il cmdlet Get-WindowsFeature, che viene eseguito in modo implicito in un'attività inlineScript.

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

È anche possibile eseguire cmdlet che sono esclusi perché non sono implementati come attività, ma è necessario eseguirli in un'attività inlineScript. Ad esempio, il flusso di lavoro seguente usa un'attività inlineScript per eseguire il cmdlet Get-Variable, che è escluso.

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

È anche possibile usare espressioni in un flusso di lavoro, incluse espressioni aritmetiche e istruzioni di confronto. Il flusso di lavoro di Windows PowerShell esegue automaticamente le espressioni in un'attività speciale progettata per questo scopo.

Ad esempio, il flusso di lavoro seguente include un'espressione. Come tutte le espressioni, viene eseguita in un'attività.

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

    320GB / 3MB
}

Per altre informazioni sulle attività, vedere Uso delle attività nei flussi di lavoro di script.

Come usare i parametri di attività

Le attività sono comandi con parametri, proprio come i cmdlet. Quando un cmdlet viene convertito in un'attività, la sintassi e i parametri rimangono inalterati. Esistono alcune eccezioni, elencate nell'argomento della Guida "Attività nei flussi di lavoro di script".

Tuttavia, i parametri posizionali non sono validi nelle attività, quindi tutti i nomi di parametro sono obbligatori. Gli alias e le abbreviazioni di parametri sono invece consentiti. Ad esempio, nel flusso di lavoro di esempio seguente, i parametri Name dei cmdlet Get-Process, Get-WindowsFeature e Get-Variable sono presenti nei comandi.

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

I parametri dinamici non sono validi nelle attività. Per chiamare un parametro dinamico, racchiudere il comando in un'attività InlineScript. Ad esempio, il flusso di lavoro seguente include un'attività inlineScript che usa il parametro dinamico CodeSigningCert del cmdlet Get-ChildItem. Il parametro CodeSigningCert viene aggiunto dal provider di certificati e funziona solo nell'unità Cert.

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

Per altre informazioni sull'attività inlineScript, vedere Esecuzione dei comandi di Windows PowerShell in un flusso di lavoro.

Come usare i parametri comuni di attività

Il flusso di lavoro di Windows PowerShell aggiunge un set di parametri comuni di attività alle attività. Questi parametri consentono di impostare opzioni importanti negli ambienti con più computer.

Alcuni parametri comuni del flusso di lavoro sono anche parametri comuni di attività. Questa funzionalità consente di creare eccezioni specifiche dell'attività ai valori dei parametri comuni del flusso di lavoro. È ad esempio possibile usare il parametro PSComputerName di un'attività per eseguirla solo in determinati computer oppure il parametro PSCredential per eseguirla con credenziali alternative.

I parametri comuni di attività sono validi per la maggior parte delle attività, ma non per tutte. Ad esempio, i parametri comuni di attività non sono validi nelle attività Suspend-Workflow e Checkpoint-Workflow. Non sono inoltre disponibili in cmdlet o espressioni che il flusso di lavoro di Windows PowerShell esegue automaticamente in un'attività. I parametri comuni di attività sono disponibili nell'attività InlineScript, ma non nei comandi del blocco di script InlineScript.

Le attività del flusso di lavoro seguente usano parametri comuni di attività laddove sono validi.

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
}

Per altre informazioni sui parametri comuni di attività, vedere Uso delle attività nei flussi di lavoro di script.

Come ottenere i valori dei parametri comuni

Il flusso di lavoro di Windows PowerShell aggiunge le variabili di runtime del flusso di lavoro a tutti i flussi di lavoro. Le variabili di runtime del flusso di lavoro includono i valori dei parametri comuni, quelli dei parametri comuni del flusso di lavoro e altri valori cruciali per i flussi di lavoro.

I valori delle variabili sono estremamente utili. È consigliabile esaminarle e usarle nei flussi di lavoro. Ad esempio, quando si esegue un flusso di lavoro, il parametro PSComputerName accetta i nomi dei computer di destinazione, ma quando si accede alla variabile $PSComputerName in un flusso di lavoro, questa contiene il nome del computer in cui il flusso di lavoro è attualmente in esecuzione.

Per informazioni sulle variabili di runtime del flusso di lavoro, vedere Enumerazione PSWorkflowRuntimeVariable.

Per accedere ai valori dei parametri dall'interno del flusso di lavoro, usare il nome della variabile. Non è necessario definire la variabile.

Ad esempio, il flusso di lavoro seguente usa il valore del parametro comune PSConnectionRetryCount facendovi riferimento come variabile $PSConnectionRetryCount.

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

L'esempio seguente mostra che quando si usa il parametro PSConnectionRetryCount durante l'esecuzione del flusso di lavoro, il relativo valore è visibile nel flusso di lavoro.

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

Per cambiare i valori dei parametri comuni e di runtime in un flusso di lavoro, usare l'attività Set-PSWorkflowData.

Ad esempio, il flusso di lavoro seguente include un comando che cambia il valore di PSConnectionRetryCount.

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.

Per altre informazioni sulle variabili nel flusso di lavoro di Windows PowerShell, vedere gli argomenti della Guida seguenti.

Come ottenere variabili di runtime e valori dei parametri comuni

Il flusso di lavoro di Windows PowerShell aggiunge le variabili di runtime del flusso di lavoro a tutti i flussi di lavoro. Le variabili di runtime del flusso di lavoro includono i valori dei parametri comuni, quelli dei parametri comuni del flusso di lavoro e altri valori cruciali per i flussi di lavoro.

I valori delle variabili sono estremamente utili. È consigliabile esaminarle e usarle nei flussi di lavoro. Ad esempio, quando si esegue un flusso di lavoro, il parametro PSComputerName accetta i nomi dei computer di destinazione, ma quando si accede alla variabile $PSComputerName in un flusso di lavoro, questa contiene il nome del computer in cui il flusso di lavoro è attualmente in esecuzione.

Per informazioni sulle variabili di runtime del flusso di lavoro, vedere Enumerazione PSWorkflowRuntimeVariable.

Per accedere ai valori dei parametri dall'interno del flusso di lavoro, usare il nome della variabile. Non è necessario definire la variabile.

Ad esempio, il flusso di lavoro seguente usa il valore del parametro comune PSConnectionRetryCount facendovi riferimento come variabile $PSConnectionRetryCount.

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

L'esempio seguente mostra che quando si usa il parametro PSConnectionRetryCount durante l'esecuzione del flusso di lavoro, il relativo valore è visibile nel flusso di lavoro.

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

Per cambiare i valori dei parametri comuni e di runtime in un flusso di lavoro, usare l'attività Set-PSWorkflowData.

Ad esempio, il flusso di lavoro seguente include un comando che cambia il valore di PSConnectionRetryCount.

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.

Per altre informazioni sulle variabili nel flusso di lavoro di Windows PowerShell, vedere gli argomenti della Guida seguenti.

Come eseguire uno script in un flusso di lavoro

Per eseguire uno script, ovvero un file con estensione ps1, in un flusso di lavoro, racchiudere la chiamata allo script in un'attività InlineScript. Analogamente ad altri comandi e attività, lo script viene eseguito in tutti i computer di destinazione del flusso di lavoro e l'output viene restituito al flusso di lavoro.

Ad esempio, il flusso di lavoro seguente include un'attività InlineScript che esegue uno script. Lo script viene archiviato in una directory condivisa. Il flusso di lavoro usa il parametro dell'attività PSPersist per acquisire un checkpoint al completamento dello script.

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

Poiché i flussi di lavoro sono progettati per l'esecuzione in più computer, usare un parametro assoluto per il file di script, invece che relativo.

Come eseguire comandi in parallelo

Le parole chiave Parallel e ForEach -Parallel ottimizzano il flusso di lavoro eseguendo i comandi simultaneamente e in un ordine indeterminato. La parola chiave Sequence esegue i comandi selezionati in sequenza all'interno di un blocco di script Parallel. Queste parole chiave sono valide solo in un flusso di lavoro. Sono valide in flussi di lavoro nidificati, ma non nelle funzioni nidificate in un flusso di lavoro. Per impostazione predefinita, i comandi vengono eseguiti in sequenza, per cui ogni comando viene completato prima che inizi il successivo.

Poiché l'esecuzione parallela può offrire miglioramenti significativi delle prestazioni, in particolare quando il flusso di lavoro è destinato a numerosi computer, è consigliabile usarla ogni volta che è possibile.

I seguenti tipi di comandi e attività sono candidati validi per l'esecuzione parallela.

  • Comandi che non condividono dati, ad esempio Get-Process e Get-Service.

  • Comandi che vengono eseguiti in una raccolta di elementi simili. La maggior parte delle istruzioni ForEach è adatta per l'esecuzione ForEach -Parallel.

Parallel

I comandi di un blocco di script Parallel possono essere eseguiti contemporaneamente. L'ordine in cui vengono eseguiti non è prestabilito.

Il diagramma seguente mostra la sintassi di un flusso di lavoro con la parola chiave Parallel e il blocco di script.

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

Ad esempio, il flusso di lavoro seguente include un blocco di script Parallel che esegue attività e ottiene processi e servizi nel computer. Poiché le chiamate a Get-Process e a Get-Service sono indipendenti, possono essere eseguite simultaneamente in qualsiasi ordine.

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

ForEach -Parallel

Il parametro Parallel della parola chiave ForEach esegue i comandi in un blocco di script ForEach una volta per ogni elemento nella raccolta specificata. Gli elementi della raccolta vengono elaborati in parallelo. I comandi del blocco di script vengono eseguiti in sequenza.

Come l'istruzione ForEach in Windows PowerShell, la variabile che contiene la raccolta ($<Collection>) deve essere definita prima dell'istruzione ForEach -Parallel, ma la variabile che rappresenta l'elemento corrente ($<item>) è definita nell'istruzione ForEach -Parallel.

Il diagramma seguente mostra la sintassi del comando.

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

Ad esempio, il flusso di lavoro seguente contiene un'istruzione Foreach -Parallel che elabora i dischi ottenuti dall'attività Get-Disk. I comandi del blocco di script vengono eseguiti in sequenza, mentre nei dischi in parallelo.

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

Sequence

La parola chiave Sequence esegue i comandi in sequenza all'interno di un blocco di script Parallel. Il blocco di script Sequence viene eseguito in parallelo con altri comandi, mentre i comandi al suo interno vengono eseguiti in sequenza e nell'ordine specificato.

Il blocco di codice seguente mostra la sintassi di un blocco di script Sequence. L'attività 3 potrebbe essere eseguita prima o in contemporanea all'attività 1 e all'attività 2, mentre l'attività 4 viene eseguita solo dopo il completamento dell'attività 3.

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

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