Condividi tramite


about_Jobs

ARGOMENTO
    about_Jobs

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

DESCRIZIONE DETTAGLIATA
    In questo argomento viene illustrato come eseguire processi in 
    background in Windows 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, viene immediatamente 
    visualizzato il prompt dei comandi, anche se il completamento del 
    processo richiede più tempo. Durante l'esecuzione del processo, è 
    possibile continuare a lavorare nella sessione senza interruzione. 

    Importante: i processi in background avviati mediante il 
                parametro Start-Job o AsJob di Invoke-Command sono basati 
                sull'infrastruttura remota di Windows PowerShell. Per utilizzare 
                queste funzionalità, è necessario configurare Windows PowerShell 
                per la comunicazione remota, anche se il processo in background 
                viene eseguito unicamente nel computer locale. Per ulteriori 
                informazioni, vedere about_Remote_Requirements.

 
        
 MODALITÀ DI AVVIO DI UN PROCESSO NEL COMPUTER LOCALE
    Per avviare un processo in background nel computer locale, 
    utilizzare il cmdlet Start-Job. 

    Per scrivere un comando Start-Job, racchiudere il comando eseguito dal 
    processo tra parentesi graffe ( { } ). Utilizzare 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 relativi risultati.
    
    Salvare l'oggetto processo in una variabile, quindi utilizzarlo 
    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} 

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

 
 OTTENERE OGGETTI PROCESSO

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

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

    get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Running    True         localhost  get-process


    È inoltre possibile salvare l'oggetto processo in una variabile e 
    utilizzarlo 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 è stato completato o meno. Un processo completato 
    presenta lo stato "Complete" o "Failed". È inoltre possibile che 
    un processo sia bloccato o in esecuzione.


    get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process



 OTTENERE I RISULTATI DI UN PROCESSO

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

    Il comando seguente utilizza il cmdlet Receive-Job per ottenere i 
    risultati del processo. Utilizza 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 i risultati del processo 
     presenti nella variabile $job nella variabile $results.

    $results = receive-job -job $job

     È altresì possibile salvare i risultati del processo in un file 
     mediante l'operatore di rendirizzamento (>) o il cmdlet 
     Out-File. Il comando seguente utilizza l'operatore di 
     reindirizzamento per salvare i risultati del processo presenti 
     nella variabile $job nel file Results.txt.


        receive-job -job $job > results.txt


    

 OTTENERE E MANTENERE RISULTATI PARZIALI DI PROCESSO

    Il cmdlet Receive-Job restituisce i risultati di un processo in 
    background. Se il processo è completo, Receive-Job restituisce lo 
    stato Complete del processo. Se il processo è ancora in 
    esecuzione, Receive-Job ottiene i risultati generati fino a 
    questo momento. È possibile eseguire nuovamente i comandi 
    Receive-Job per ottenere i risultati rimanenti.

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

    Mediante i comandi seguenti vengono mostrati 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 i risultati del processo restituiti vengano eliminati 
    mediante Receive-Job, utilizzare il parametro Keep. Di conseguenza, 
    Receive-Job restituisce tutti i risultati generati fino a questo momento.

    Mediante i comandi seguenti viene mostrato l'effetto dell'utilizzo del 
    parametro Keep su 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 il cui completamento richiede tempo, è 
    possibile utilizzare le proprietà dell'oggetto processo per 
    determinare quando il processo è completato. Il comando seguente 
    utilizza 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  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process
        2   Job2  Running     True         localhost  get-eventlog -log syst...
        3   Job3  Complete    True         localhost  dir -path c:\* -recurse


    In questo caso, la proprietà State rivela che Job 2 è ancora in 
    esecuzione. Se si dovesse utilizzare il cmdlet Receive-Job per 
    ottenere ora i risultati del processo, tali risultati sarebbero 
    incompleti. È possibile utilizzare il cmdlet Receive-Job 
    ripetutamente per ottenere tutti i risultati. Per impostazione 
    predefinita, ogni volta che viene utilizzato, si ottengono 
    unicamente i risultati non ancora ricevuti, anche se è possibile 
    utilizzare il parametro Keep del cmdlet Receive-Job per mantenere 
    i risultati, anche se sono già stati ricevuti.

    A questo punto, è possibile scrivere i risultati su un file e 
    aggiungere i risultati man mano che vengono ricevuti. In 
    alternativa, è possibile attendere e controllare lo stato del 
    processo in un secondo momento.

    È inoltre possibile utilizzare il cmdlet Wait-Job per attendere 
    altri o tutti i risultati del processo. Wait-Job consente di 
    attendere un particolare processo, tutti i processi o tutti 
    quelli che devono essere completati.
  
    Il comando seguente utilizza il cmdlet Wait-Job per attendere un 
    processo con ID 10.

    wait-job -ID 10

    Di conseguenza, il prompt di Windows PowerShell viene eliminato 
    finché il processo non viene completato.

    È inoltre possibile attendere un periodo di tempo prestabilito. 
    Questo comando utilizza il parametro Timeout per limitare 
    l'attesa a 120 secondi. Alla scadenza del tempo, il prompt dei 
    comandi viene nuovamente visualizzato, 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, utilizzare il cmdlet 
    Stop-Job. Il comando seguente avvia un processo per ottenere ogni 
    voce del registro eventi di sistema. L'oggetto processo viene 
    salvato nella variabile $job.

    $job = start-job -scriptblock {get-eventlog -log system} 

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

    $job | stop-job


ELIMINAZIONE DI UN PROCESSO

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

    remove-job -job $job 


ANALISI DELLE CAUSE DEL MANCATO COMPLETAMENTO DI UN PROCESSO

    Per capire perché un processo non è stato completato, utilizzare la 
    sottoproprietà Reason dell'oggetto processo.

    Il comando seguente avvia un processo senza le credenziali necessarie. 
    L'oggetto processo viene salvato nella variabile $job.


         $job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}

         Id   Name  State    HasMoreData  Location   Command
         --   ----  -----    -----------  --------   -------
         1    Job1  Failed   False         localhost  new-item -path HKLM:\S...


    Il comando seguente utilizza la proprietà Reason per trovare 
    l'errore che ha impedito il completamento del processo.

         $job.ChildJobs[0].JobStateInfo.Reason


    In questo caso, il processo non è stato completato perché nel 
    computer remoto sono state richieste credenziali esplicite per 
    l'esecuzione del comando. Il valore della proprietà Reason è:

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


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 finché uno o tutti i processi 
                     non sono stati completati.

    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 
                     utilizzare Invoke-Command per eseguire in modalità remota 
                     qualsiasi comando di processo, incluso un comando Start-Job.

 
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