about_Jobs

Breve descrição

Fornece informações sobre como as tarefas em segundo plano do PowerShell executam um comando ou expressão em segundo plano sem interagir com a sessão atual.

Descrição longa

O PowerShell executa simultaneamente comandos e scripts através de tarefas. Existem três tipos de tarefas fornecidos pelo PowerShell para suportar a simultaneidade.

  • RemoteJob - Os comandos e scripts são executados numa sessão remota. Para obter informações, consulte about_Remote_Jobs.
  • BackgroundJob - Os comandos e scripts são executados num processo separado no computador local.
  • PSTaskJob ou ThreadJob - Os comandos e scripts são executados num thread separado no mesmo processo no computador local. Para obter mais informações, veja about_Thread_Jobs.

Executar scripts remotamente, num computador separado ou num processo separado, proporciona um grande isolamento. Quaisquer erros que ocorram na tarefa remota não afetam outros trabalhos em execução ou a sessão principal que iniciou a tarefa. No entanto, a camada remota adiciona sobrecarga, incluindo a serialização de objetos. Todos os objetos são serializados e serializados à medida que são transmitidos entre a sessão principal e a sessão remota (tarefa). A serialização de objetos de dados grandes e complexos pode consumir grandes quantidades de recursos de computação e memória e transferir grandes quantidades de dados pela rede.

As tarefas baseadas em threads não são tão robustas como as tarefas remotas e em segundo plano, porque são executadas no mesmo processo em threads diferentes. Se uma tarefa tiver um erro crítico que falhe no processo, todas as outras tarefas no processo serão terminadas.

No entanto, as tarefas baseadas em threads requerem menos sobrecarga. Não utilizam a camada remota nem a serialização. Os objetos de resultado são devolvidos como referências a objetos dinâmicos na sessão atual. Sem esta sobrecarga, as tarefas baseadas em threads são executadas mais rapidamente e utilizam menos recursos do que os outros tipos de tarefas.

Importante

A sessão principal que criou a tarefa também monitoriza o estado da tarefa e recolhe dados do pipeline. O processo subordinado da tarefa é terminado pelo processo principal assim que a tarefa atingir um estado concluído. Se a sessão principal for terminada, todas as tarefas subordinadas em execução serão terminadas juntamente com os processos subordinados.

Existem duas formas de contornar esta situação:

  1. Utilize Invoke-Command para criar tarefas executadas em sessões desligadas. Para obter mais informações, veja about_Remote_Jobs.
  2. Utilize Start-Process para criar um novo processo em vez de uma tarefa. Para obter mais informações, veja Iniciar Processo.

Os cmdlets da tarefa

  • Start-Job - Inicia uma tarefa em segundo plano num computador local.
  • Get-Job - Obtém as tarefas em segundo plano que foram iniciadas na sessão atual.
  • Receive-Job - Obtém os resultados das tarefas em segundo plano.
  • Stop-Job - Para uma tarefa em segundo plano.
  • Wait-Job - Suprime a linha de comandos até que uma ou todas as tarefas estejam concluídas.
  • Remove-Job - Elimina uma tarefa em segundo plano.
  • Invoke-Command - O parâmetro AsJob cria uma tarefa em segundo plano num computador remoto. Pode utilizar Invoke-Command para executar qualquer comando de tarefa remotamente, incluindo Start-Job.

Como iniciar uma tarefa no computador local

Para iniciar uma tarefa em segundo plano no computador local, utilize o Start-Job cmdlet .

Para escrever um Start-Job comando, coloque o comando que a tarefa executa em chavetas ({}). Utilize o parâmetro ScriptBlock para especificar o comando .

O comando seguinte inicia uma tarefa em segundo plano que executa um Get-Process comando no computador local.

Start-Job -ScriptBlock {Get-Process}

Quando inicia uma tarefa em segundo plano, a linha de comandos regressa imediatamente, mesmo que a tarefa dedure um tempo prolongado a concluir. Pode continuar a trabalhar na sessão sem interrupções enquanto a tarefa é executada.

O Start-Job comando devolve um objeto que representa a tarefa. O objeto de tarefa contém informações úteis sobre a tarefa, mas não contém os resultados da tarefa.

Pode guardar o objeto de tarefa numa variável e, em seguida, utilizá-lo com os outros cmdlets de Tarefa para gerir a tarefa em segundo plano. O comando seguinte inicia um objeto de tarefa e guarda o objeto de tarefa resultante na $job variável .

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

A partir do PowerShell 6.0, pode utilizar o operador em segundo plano (&) no final de um pipeline para iniciar uma tarefa em segundo plano. Para obter mais informações, veja Operador em segundo plano.

Utilizar o operador em segundo plano é funcionalmente equivalente à utilização do Start-Job cmdlet no exemplo anterior.

$job = Get-Process &

Obter objetos de tarefa

O Get-Job cmdlet devolve objetos que representam as tarefas em segundo plano que foram iniciadas na sessão atual. Sem parâmetros, Get-Job devolve todas as tarefas iniciadas na sessão atual.

Get-Job

O objeto da tarefa contém o estado da tarefa, o que indica se a tarefa foi concluída. Uma tarefa concluída tem o estado Concluído ou Com Falhas. Uma tarefa também pode ser Bloqueada ou Em Execução.

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

Pode guardar o objeto de tarefa numa variável e utilizá-lo para representar a tarefa num comando posterior. O comando seguinte obtém a tarefa com o ID 1 e guarda-a $job na variável .

$job = Get-Job -Id 1

Obter os resultados de uma tarefa

Quando executa uma tarefa em segundo plano, os resultados não são apresentados imediatamente. Para obter os resultados de uma tarefa em segundo plano, utilize o Receive-Job cmdlet .

No exemplo seguinte, o Receive-Job cmdlet obtém os resultados da tarefa com o objeto de tarefa na $job variável .

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
    668       7     2672       6168   104    32.26   488 csrss
...

Pode guardar os resultados de uma tarefa numa variável. O comando seguinte guarda os resultados da tarefa na $job variável para a $results variável .

$results = Receive-Job -Job $job

Obter e manter resultados parciais de tarefas

O Receive-Job cmdlet obtém os resultados de uma tarefa em segundo plano. Se a tarefa estiver concluída, Receive-Job obtém todos os resultados da tarefa. Se a tarefa ainda estiver em execução, Receive-Job obtém os resultados que foram gerados até agora. Pode executar Receive-Job comandos novamente para obter os resultados restantes.

Por predefinição, Receive-Job elimina os resultados da cache onde os resultados da tarefa são armazenados. Quando volta a executar Receive-Job , obtém apenas os novos resultados que chegaram após a primeira execução.

Os comandos seguintes mostram os resultados dos Receive-Job comandos executados antes de a tarefa ser concluída.

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

Utilize o parâmetro Manter para impedir Receive-Job a eliminação dos resultados da tarefa que são devolvidos. Os comandos seguintes mostram o efeito da utilização do parâmetro Manter numa tarefa que ainda não está concluída.

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

A aguardar pelos resultados

Se executar um comando que demora muito tempo a ser concluído, pode utilizar as propriedades do objeto de tarefa para determinar quando a tarefa está concluída. O comando seguinte utiliza o Get-Job objeto para obter todas as tarefas em segundo plano na sessão atual.

Get-Job

Os resultados são apresentados numa tabela. O estado da tarefa é apresentado na coluna Estado .

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

Neste caso, a propriedade Estado revela que a Tarefa 2 ainda está em execução. Se utilizasse o Receive-Job cmdlet para obter os resultados da tarefa agora, os resultados estariam incompletos. Pode utilizar o Receive-Job cmdlet repetidamente para obter todos os resultados. Utilize a propriedade Estado para determinar quando a tarefa está concluída.

Também pode utilizar o parâmetro Aguardar do Receive-Job cmdlet . Quando utiliza este parâmetro, o cmdlet não devolve a linha de comandos até que a tarefa esteja concluída e todos os resultados estejam disponíveis.

Também pode utilizar o Wait-Job cmdlet para aguardar por qualquer ou todos os resultados da tarefa. Wait-Job permite-lhe esperar por um ou mais trabalhos específicos ou por todos os trabalhos. O comando seguinte utiliza o Wait-Job cmdlet para aguardar por uma tarefa com o ID 10.

Wait-Job -ID 10

Como resultado, o pedido do PowerShell é suprimido até que a tarefa seja concluída.

Também pode esperar por um período de tempo predeterminado. Este comando utiliza o parâmetro Tempo Limite para limitar a espera a 120 segundos. Quando o tempo expirar, a linha de comandos é devolvida, mas a tarefa continua a ser executada em segundo plano.

Wait-Job -ID 10 -Timeout 120

Parar uma tarefa

Para parar uma tarefa em segundo plano, utilize o Stop-Job cmdlet . O comando seguinte inicia uma tarefa para obter todas as entradas no registo de eventos do Sistema. Guarda o objeto de tarefa na $job variável.

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

O seguinte comando para a tarefa. Utiliza um operador de pipeline (|) para enviar a tarefa na $job variável para Stop-Job.

$job | Stop-Job

Eliminar um trabalho

Para eliminar uma tarefa em segundo plano, utilize o Remove-Job cmdlet. O seguinte comando elimina a tarefa na $job variável.

Remove-Job -Job $job

Investigar uma tarefa falhada

As tarefas podem falhar por vários motivos. O objeto da tarefa contém uma propriedade Reason que contém informações sobre a causa da falha.

O exemplo seguinte inicia uma tarefa sem as credenciais necessárias.

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

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

Inspecione a propriedade Razão para encontrar o erro que causou a falha da tarefa.

$job.ChildJobs[0].JobStateInfo.Reason

Neste caso, a tarefa falhou porque o computador remoto necessitava de credenciais explícitas para executar o comando. A propriedade Reason contém a seguinte mensagem:

A ligação ao servidor remoto falhou com a seguinte mensagem de erro: "Acesso negado".

Ver também