Partilhar via


Acerca das Tarefas

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

Este tópico explica como executar tarefas em segundo plano no PowerShell num computador local. Para obter informações sobre a execução de tarefas em segundo plano em computadores remotos, consulte about_Remote_Jobs.

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.

OS CMDLETS DA TAREFA

Cmdlet Descrição
Start-Job Inicia uma tarefa em segundo plano num computador local.
Get-Job Obtém as tarefas em segundo plano que foram iniciadas no
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 sejam
concluído.
Remove-Job Elimina uma tarefa em segundo plano.
Invoke-Command O parâmetro AsJob executa qualquer comando como fundo
num computador remoto. Também pode utilizar
Invoke-Command para executar qualquer comando de tarefa remotamente,
incluindo um comando Start-Job.

COMO INICIAR UMA TAREFA NO COMPUTADOR LOCAL

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

Para escrever um comando Start-Job, 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}

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

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

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

Também pode utilizar o Get-Job cmdlet para obter objetos que representam as tarefas iniciadas na sessão atual. Get-Job devolve o mesmo objeto de tarefa que Start-Job devolve.

OBTER OBJETOS DE TAREFA

Para obter o objeto que representa as tarefas em segundo plano iniciadas na sessão atual, utilize o Get-Job cmdlet . Sem parâmetros, Get-Job devolve todas as tarefas iniciadas na sessão atual.

Por exemplo, o comando seguinte obtém as tarefas na sessão atual.

PS C:> Get-Job

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

Também 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 na variável $job.

$job = Get-Job -Id 1

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 "Complete" ou "Failed". Uma tarefa também pode estar bloqueada ou em execução.

Get-Job

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

OBTER OS RESULTADOS DE UMA TAREFA

Quando executa uma tarefa em segundo plano, os resultados não são apresentados imediatamente. Em vez disso, o cmdlet Start-Job devolve um objeto de tarefa que representa a tarefa, mas não contém os resultados. Para obter os resultados de uma tarefa em segundo plano, utilize o Receive-Job cmdlet .

O comando seguinte utiliza o Receive-Job cmdlet para obter os resultados da tarefa. Utiliza um objeto de tarefa guardado na variável $job para identificar a tarefa.

Receive-Job -Job $job

O cmdlet Receive-Job devolve os resultados da tarefa.

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

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

$results = Receive-Job -Job $job

Além disso, pode guardar os resultados da tarefa num ficheiro com o operador de redirecionamento (>) ou o cmdlet Out-File. O comando seguinte utiliza o operador de redirecionamento para guardar os resultados da tarefa na variável $job no ficheiro de Results.txt.

Receive-Job -Job $job > results.txt

OBTER E MANTER RESULTADOS PARCIAIS DO TRABALHO

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

Quando Receive-Job devolve resultados, por predefinição, elimina esses resultados da cache onde os resultados da tarefa são armazenados. Se executar outro Receive-Job comando, obtém apenas os resultados que ainda não foram recebidos.

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

Para impedir Receive-Job a eliminação dos resultados da tarefa devolvidos, utilize o parâmetro Manter . Como resultado, Receive-Job devolve todos os resultados que foram gerados até essa altura.

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. Por predefinição, sempre que o utilizar, obtém apenas os resultados que ainda não foram recebidos, mas pode utilizar o parâmetro Manter do cmdlet Receive-Job para manter os resultados, mesmo que já tenham sido recebidos.

Pode escrever os resultados parciais num ficheiro e, em seguida, acrescentar resultados mais recentes à medida que chegam ou pode esperar e verificar o estado da tarefa mais tarde.

Pode utilizar o parâmetro Aguardar do Receive-Job cmdlet, que 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 trabalho específico, por todas as tarefas ou por qualquer uma das tarefas a ser concluída.

O comando seguinte utiliza o cmdlet Wait-Job para aguardar 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 variável $job.

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

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

$job | Stop-Job

ELIMINAR UMA TAREFA

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

Remove-Job -Job $job

INVESTIGAR UMA TAREFA FALHADA

Para descobrir por que motivo uma tarefa falhou, utilize a subpropriedade Reason do objeto de tarefa.

O comando seguinte inicia uma tarefa sem as credenciais necessárias. Guarda o objeto de tarefa na variável $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:...

O comando seguinte utiliza a propriedade Motivo 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. O valor da propriedade Reason é:

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

CONSULTE TAMBÉM

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command