about_Jobs

Aggiornamento: maggio 2014

Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

ARGOMENTO

about_Jobs

DESCRIZIONE BREVE

Fornisce informazioni su come i processi in background di Windows PowerShell eseguono un comando o un'espressione in background senza interazioni con la sessione corrente.

DESCRIZIONE LUNGA

In questo argomento viene descritto come eseguire i processi in background in Windows PowerShell in un computer locale. Per informazioni sull'esecuzione di processi in background nei computer remoti, vedere about_Remote_Jobs.

Quando si avvia un processo in background, viene immediatamente restituito il prompt dei comandi, persino se il completamento del processo richiede molto tempo. È possibile continuare a lavorare nella sessione senza interruzioni durante l'esecuzione del processo.

CMDLET JOB

Start-Job

Avvia un processo in background in un computer locale.

Get-Job

Ottiene i processi in background avviati nella sessione corrente.

Receive-Job

Ottiene i risultati dei processi in background.

Stop-Job

Arresta un processo in background.

Wait-Job

Elimina il prompt dei comandi fino al completamento di uno o tutti i processi.

Remove-Job

Elimina un processo in background.

Invoke-Command

Il parametro AsJob esegue qualsiasi comando come processo in background in un computer remoto. È inoltre possibile usare Invoke-Command per eseguire qualsiasi comando del processo in remoto, incluso un comando Start-Job.

COME AVVIARE UN PROCESSO NEL COMPUTER LOCALE

Per avviare un processo in background nel computer locale, usare il cmdlet Start-Job.

Per scrivere un comando Start-Job, racchiudere il comando che viene eseguito dal processo tra parentesi graffe ( { } ). Usare il parametro ScriptBlock per specificare il comando.

Il comando seguente avvia un processo in background che esegue un comando Get-Process nel computer locale.

        Start-Job -ScriptBlock {Get-Process}

Il comando Start-job restituisce un oggetto che rappresenta il processo. L'oggetto processo contiene informazioni utili sul processo, ma non contiene i risultati del processo.

Salvare l'oggetto processo in una variabile e quindi usarlo con altri cmdlet Job per gestire il processo in background. Il comando seguente avvia un oggetto processo e salva l'oggetto processo risultante nella variabile $job.

        $job = Start-Job -ScriptBlock {Get-Process}

È inoltre possibile usare il cmdlet Get-Job per ottenere gli oggetti che rappresentano i processi avviati nella sessione corrente. Get-Job restituisce lo stesso oggetto processo restituito da Start-Job.

VISUALIZZAZIONE DEGLI OGGETTI PROCESSO

Per visualizzare gli oggetti che rappresentano i processi in background avviati nella sessione corrente, usare il cmdlet Get-Job. Senza parametri, Get-Job restituisce tutti i processi avviati nella sessione corrente.

Ad esempio, il comando seguente ottiene i processi nella sessione corrente.

        PS C:\>Get-Job

        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob Running    True         localhost  Get-Process

È inoltre possibile salvare l'oggetto processo in una variabile e usarlo per rappresentare il processo in un comando successivo. Il comando seguente ottiene il processo con ID 1 e lo salva nella variabile $job.

       $job = Get-Job -Id 1  

L'oggetto processo contiene lo stato del processo, che indica se il processo è terminato. Un processo terminato presenta lo stato "Complete" o "Failed". Un processo può anche essere bloccato o in esecuzione.

Get-Job


        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob Complete   True         localhost  Get-Process

VISUALIZZAZIONE DEI RISULTATI DI UN PROCESSO

Quando si esegue un processo in background, i risultati non vengono visualizzati immediatamente. Al contrario, il cmdlet Start-Job restituisce un oggetto processo che rappresenta il processo, ma non contiene i risultati. Per ottenere i risultati di un processo in background, usare il cmdlet Receive-Job.

Il comando seguente usa il cmdlet Receive-Job per ottenere i risultati del processo. Il comando usa un oggetto processo salvato nella variabile $job per identificare il processo.

Receive-Job -Job $job

Il cmdlet Receive-Job restituisce i risultati del processo.

           Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
           -------  ------    -----      ----- -----   ------    -- -----------
               103       4    11328       9692    56           1176 audiodg
               804      14    12228      14108   100   101.74  1740 CcmExec
               668       7     2672       6168   104    32.26   488 csrss
   ...

È inoltre possibile salvare i risultati di un processo in una variabile. Il comando seguente salva nella variabile $results i risultati del processo nella variabile $job.

$results = Receive-Job -Job $job

Inoltre, è possibile salvare i risultati del processo in un file mediante l'operatore di reindirizzamento (>) o il cmdlet Out-File. Il comando seguente usa l'operatore di reindirizzamento per salvare i risultati del processo nella variabile $job nel file Results.txt.

        Receive-Job -Job $job > results.txt

VISUALIZZAZIONE E MANTENIMENTO DEI RISULTATI PARZIALI DI UN PROCESSO

Il cmdlet Receive-Job ottiene i risultati di un processo in background. Se il processo è stato completato, Receive-Job ottiene tutti i risultati del processo. Se il processo è ancora in esecuzione, Receive-Job ottiene i risultati generati finora. È possibile eseguire nuovamente i comandi Receive-Job per ottenere i risultati rimanenti.

Per impostazione predefinita, quando Receive-Job restituisce risultati, elimina quelli provenienti dalla cache in cui sono archiviati i risultati del processo. Se si esegue un altro comando Receive-Job, si ottengono solo i risultati che non sono stati ancora ricevuti.

I comandi seguenti mostrano i risultati dei comandi Receive-Job eseguiti prima del completamento del processo.

C:\PS> Receive-Job -Job $job

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
             68       3     2632        664    29     0.36   1388 ccmsetup
            749      22    21468      19940   203   122.13   3644 communicator
            905       7     2980       2628    34   197.97    424 csrss
           1121      25    28408      32940   174   430.14   3048 explorer

Per impedire che Receive-Job elimini i risultati del processo restituiti, usare il parametro Keep. Di conseguenza, Receive-Job restituisce tutti i risultati generati fino a quel momento.

I comandi seguenti mostrano l'effetto dell'utilizzo del parametro Keep in un processo non ancora completato.

C:\PS> Receive-Job -Job $job -Keep

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job -Keep

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec
             68       3     2632        664    29     0.36   1388 ccmsetup
            749      22    21468      19940   203   122.13   3644 communicator
            905       7     2980       2628    34   197.97    424 csrss
           1121      25    28408      32940   174   430.14   3048 explorer

ATTESA DEI RISULTATI

Se si esegue un comando il cui completamento richiede molto tempo, è possibile usare le proprietà dell'oggetto processo per determinare quando il processo è completo. Il comando seguente usa l'oggetto Get-Job per ottenere tutti i processi in background nella sessione corrente.

Get-Job

I risultati vengono visualizzati in una tabella. Lo stato del processo viene visualizzato nella colonna State.

        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob Complete    True         localhost  Get-Process
        2   Job2  BackgroundJob Running     True         localhost  Get-EventLog -Log Syst...
        3   Job3  BackgroundJob Complete    True         localhost  dir -Path C:\* -Recurse

In questo caso, la proprietà State indica che Job 2 è ancora in esecuzione. In caso di utilizzo del cmdlet Receive-Job per ottenere i risultati del processo in questo momento, i risultati sarebbero incompleti. È possibile usare il cmdlet Receive-Job ripetutamente per ottenere tutti i risultati. Per impostazione predefinita, ogni volta che viene usato, si ottengono solo i risultati che non sono stati già ricevuti, ma è possibile utilizzare il parametro Keep del cmdlet Receive-Job per mantenere i risultati, anche se sono stati ricevuti in precedenza.

È possibile scrivere i risultati parziali in un file e quindi aggiungere quelli più recenti nel momento in cui vengono ricevuti oppure attendere e controllare lo stato del processo in un secondo momento.

È possibile usare il parametro Wait del cmdlet Receive-Job, che non restituisce il prompt dei comandi finché il processo è completo e tutti i risultati sono disponibili.

È inoltre possibile usare il cmdlet Wait-Job per attendere i risultati del processo. Wait-Job consente di attendere il completamento di un determinato processo, di tutti i processi o di una parte di essi.

Il comando seguente usa il cmdlet Wait-Job per attendere un processo con ID 10.

Wait-Job -ID 10

Di conseguenza, il prompt di Windows PowerShell viene eliminato fino al completamento del processo.

È inoltre possibile attendere un periodo di tempo predeterminato. Questo comando usa il parametro Timeout per limitare l'attesa a 120 secondi. Allo scadere del tempo si ritorna al prompt dei comandi, ma il processo continua a essere eseguito in background.

Wait-Job -ID 10 -Timeout 120

ARRESTO DI UN PROCESSO

Per arrestare un processo in background, usare il cmdlet Stop-Job. Il comando seguente avvia un processo per ottenere tutte le voci nel registro eventi di sistema. Salva l'oggetto processo nella variabile $job.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

Il comando seguente arresta il processo. Usa un operatore pipeline (|) per inviare il processo nella variabile $job a Stop-Job.

$job | Stop-Job

ELIMINAZIONE DI UN PROCESSO

Per eliminare un processo in background, usare il cmdlet Remove-Job. Il comando seguente elimina il processo nella variabile $job.

Remove-Job -Job $job

ANALISI DI UN PROCESSO NON RIUSCITO

Per scoprire la causa della mancata riuscita di un processo, usare la sottoproprietà Reason dell'oggetto processo.

Il comando seguente avvia un processo senza le credenziali necessarie. Salva l'oggetto processo nella variabile $job.

         $job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}

         Id   Name  PSJobTypeName State    HasMoreData  Location   Command
         --   ----  ------------- -----    -----------  --------   -------
         1    Job1  BackgroundJob Failed   False        localhost  New-Item -Path HKLM:\S...

Il comando seguente usa la proprietà Reason per individuare l'errore che ha causato l'esito negativo del processo.

         $job.ChildJobs[0].JobStateInfo.Reason

In questo caso, il processo non è riuscito perché il computer remoto ha richiesto credenziali esplicite per eseguire il comando. Il valore della proprietà Reason è:

         Connecting to remote server failed with the following error 
         message : Access is denied.

VEDERE ANCHE

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command