Condividi tramite


Informazioni sui processi

DESCRIZIONE BREVE

Fornisce informazioni sul modo in cui i processi in background di PowerShell eseguono un comando o un'espressione in background senza interagire con la sessione corrente.

DESCRIZIONE LUNGA

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

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

CMDLET JOB

Cmdlet Descrizione
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 Disattiva il prompt dei comandi fino a quando uno o tutti i processi sono
completare.
Remove-Job Elimina un processo in background.
Invoke-Command Il parametro AsJob esegue qualsiasi comando come sfondo
processo in un computer remoto. Il cmdlet
Invoke-Commandper eseguire qualsiasi comando del processo in modalità remota,
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 il processo viene eseguito tra parentesi graffe ({}). Usare il parametro ScriptBlock per specificare il comando.

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

Start-Job -ScriptBlock {Get-Process}

Il Start-Job comando 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 gli 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}

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

RECUPERO DI OGGETTI PROCESSO

Per ottenere un oggetto che rappresenta i processi in background avviati nella sessione corrente, utilizzare il Get-Job cmdlet. 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

È anche 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 completato ha uno stato "completo" o "non riuscito". Un processo potrebbe essere anche bloccato o in esecuzione.

Get-Job

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

OTTENERE I 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 Receive-Job cmdlet.

Il comando seguente usa il Receive-Job cmdlet per ottenere i risultati del processo. 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
# ...

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

$results = Receive-Job -Job $job

È possibile salvare i risultati del processo in un file usando 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 del processo nel file di Results.txt.

Receive-Job -Job $job > results.txt

RECUPERO E MANTENIMENTO DEI RISULTATI PARZIALI DEL PROCESSO

Il cmdlet Receive-Job ottiene i risultati di un processo in background. Se il processo è completo, Receive-Job ottiene tutti i risultati del processo. Se il processo è ancora in esecuzione, Receive-Job ottiene i risultati generati fino a questo punto. È possibile eseguire Receive-Job di nuovo i comandi per ottenere i risultati rimanenti.

Quando Receive-Job restituisce i risultati, per impostazione predefinita i risultati vengono eliminati dalla cache in cui vengono archiviati i risultati del processo. Se si esegue un altro Receive-Job comando, si ottengono solo i risultati non ancora ricevuti.

I comandi seguenti mostrano i risultati dei Receive-Job comandi 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 evitare di Receive-Job eliminare i risultati del processo restituiti, usare il parametro Keep . Di conseguenza, Receive-Job restituisce tutti i risultati generati fino a quel momento.

Nei comandi seguenti viene illustrato 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

IN ATTESA DEI RISULTATI

Se si esegue un comando che richiede molto tempo per il completamento, è possibile usare le proprietà dell'oggetto processo per determinare quando il processo è completo. Il comando seguente usa l' Get-Job oggetto 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 stato.

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

In questo caso, la proprietà state rivela che il processo 2 è ancora in esecuzione. Se si utilizza il Receive-Job cmdlet per ottenere i risultati del processo adesso, i risultati saranno incompleti. È possibile utilizzare Receive-Job ripetutamente il cmdlet per ottenere tutti i risultati. Per impostazione predefinita, ogni volta che si usa, si ottengono solo i risultati non ancora ricevuti, ma è possibile usare il parametro Keep del cmdlet Receive-Job per conservare i risultati, anche se sono già stati ricevuti.

È possibile scrivere i risultati parziali in un file e quindi accodare i risultati più recenti Man mano che arrivano oppure attendere e controllare lo stato del processo in un secondo momento.

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

È inoltre possibile utilizzare il Wait-Job cmdlet per attendere uno o tutti i risultati del processo. Wait-Jobconsente di attendere un determinato processo, per tutti i processi o per tutti i processi da completare.

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

Wait-Job -ID 10

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

È anche possibile attendere un periodo di tempo predeterminato. Questo comando usa il parametro timeout per limitare l'attesa a 120 secondi. Al termine dell'intervallo di tempo, il prompt dei comandi viene restituito, ma l'esecuzione del processo continua in background.

Wait-Job -ID 10 -Timeout 120

ARRESTO DI UN PROCESSO

Per arrestare un processo in background, utilizzare il Stop-Job cmdlet. Il comando seguente avvia un processo per ottenere ogni voce 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 di processo a Stop-Job .

$job | Stop-Job

ELIMINAZIONE DI UN PROCESSO

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

Remove-Job -Job $job

ANALISI DI UN PROCESSO NON RIUSCITO

Per individuare il motivo per cui un processo non è riuscito, usare la sottoproprietà Reason dell'oggetto Job.

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:...

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 richiede le credenziali esplicite per eseguire il comando. Il valore della proprietà Reason è:

Connessione al server remoto non riuscita con il seguente messaggio di errore: accesso negato.

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