about_Job_Details
Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0
TÓPICO
about_Job_Details
DESCRIÇÃO BREVE
Fornece detalhes sobre trabalhos em segundo plano nos computadores locais e remotos.
DESCRIÇÃO DETALHADA
Este tópico explica o conceito de um trabalho em segundo plano e fornece informações técnicas sobre como os trabalhos em segundo plano funcionam no Windows PowerShell®.
Este tópico é um complemento dos tópicos about_Jobs e about_Remote_Jobs.
SOBRE TRABALHOS EM SEGUNDO PLANO
Um trabalho em segundo plano executa um comando ou uma expressão de forma assíncrona. Ele pode executar um cmdlet, uma função, um script ou qualquer outra tarefa baseada em comando. Ele foi projetado para executar comandos que levam um longo período, mas você pode usá-lo para executar qualquer comando em segundo plano.
Quando um comando síncrono é executado, o prompt de comando do Windows PowerShell é suprimido até que o comando seja concluído. Mas um trabalho em segundo plano não suprime o prompt do Windows PowerShell. Um comando para iniciar um trabalho em segundo plano retorna um objeto de trabalho. O prompt retorna imediatamente, para que você possa trabalhar em outras tarefas enquanto o trabalho em segundo plano é executado.
No entanto, quando você inicia um trabalho em segundo plano, você não obtém os resultados imediatamente, mesmo se o trabalho for executado muito rapidamente. O objeto de trabalho retornado contém informações úteis sobre o trabalho, mas não contém os resultados dele. Você deve executar um comando separado para obter os resultados do trabalho. Você também pode executar comandos para interromper o trabalho, para aguardar até que o trabalho seja concluído e para excluir o trabalho.
Para tornar o tempo de um trabalho em segundo plano independente de outros comandos, cada trabalho em segundo plano é executado em seu próprio ambiente do Windows PowerShell (uma "sessão"). No entanto, isso pode ser uma conexão temporária que é criada apenas para executar o trabalho e, em seguida, é destruída, ou pode ser uma sessão persistente (uma PSSession) que pode ser usada para executar vários trabalhos ou comandos relacionados.
COMO USAR OS CMDLETS DE TRABALHO
Use um comando Start-Job para iniciar um trabalho em segundo plano em um computador local. O Start-Job retorna um objeto de trabalho. Você também pode obter objetos que representam os trabalhos que foram iniciados no computador local usando o cmdlet Get-Job.
Para obter os resultados do trabalho, use um comando Receive-Job. Se o trabalho não estiver concluído, o Receive-Job retornará resultados parciais. Você também pode usar o cmdlet Wait-Job para suprimir o prompt de comando até que um ou todos os trabalhos que foram iniciados na sessão sejam concluídos.
Para interromper um trabalho em segundo plano, use o cmdlet Stop-Job. Para excluir um trabalho, use o cmdlet Remove-Job.
Para obter mais informações sobre como os cmdlets funcionam, consulte o tópico de Ajuda para cada cmdlet e about_Jobs.
INICIAR TRABALHOS EM SEGUNDO PLANO EM COMPUTADORES REMOTOS
Você pode criar e gerenciar trabalhos em segundo plano em um computador local ou remoto. Para executar um trabalho em segundo plano remotamente, use o parâmetro AsJob de um cmdlet como Invoke-Command ou use o cmdlet Invoke-Command para executar um comando Start-Job remotamente. Você também pode iniciar um trabalho em segundo plano em uma sessão interativa.
Para obter mais informações sobre trabalhos remotos em segundo plano, consulte about_Remote_Jobs.
TRABALHOS FILHO
Cada trabalho em segundo plano consiste em um trabalho pai e um ou mais trabalhos filho. Em trabalhos iniciados usando Start-Job ou o parâmetro AsJob do Invoke-Command, o trabalho pai é um executivo. Ele não é executado em nenhum comando nem retorna resultados. Na verdade, os comandos são executados pelos trabalhos filho. (Trabalhos iniciados usando outros cmdlets talvez funcionem de forma diferente.)
Os trabalhos filho são armazenados na propriedade ChildJobs do objeto de trabalho pai. A propriedade ChildJobs pode conter um ou vários objetos de trabalho filho. Os objetos de trabalho filho têm um nome, ID e ID da instância que diferem do trabalho pai, para que você possa gerenciar os trabalhos pai e filho individualmente ou como uma unidade.
Para obter os trabalhos pai e filho de um trabalho, use o parâmetro IncludeChildJobs do cmdlet Get-Job. O parâmetro IncludeChildJob é introduzido no Windows PowerShell 3.0.
C:\PS> Get-Job -IncludeChildJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Failed True localhost Get-Process
2 Job2 Completed True Server01 Get-Process
3 Job3 Failed False localhost Get-Process
Para obter o trabalho pai e apenas os trabalhos filho com um determinado valor State, use o parâmetro ChildJobState do cmdlet Get-Job. O parâmetro ChildJobState é introduzido no Windows PowerShell 3.0.
C:\PS> Get-Job -ChildJobState Failed
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Failed True localhost Get-Process
3 Job3 Failed False localhost Get-Process
Para obter os trabalhos filho de um trabalho em todas as versões do Windows PowerShell, use a propriedade ChildJob do trabalho pai.
C:\PS> (Get-Job Job1).ChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 Completed True Server01 Get-Process
3 Job3 Failed False localhost Get-Process
Você também pode usar um comando Get-Job no trabalho filho, conforme exibido no comando a seguir:
C:\PS> Get-Job Job3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 Failed False localhost Get-Process
A configuração do trabalho filho depende do comando que você usar para iniciar o trabalho.
Quando você usar Start-Job para iniciar um trabalho em um computador local, o trabalho consistirá em um trabalho pai executivo e um trabalho filho que executa o comando.
Quando você usar o parâmetro AsJob do Invoke-Command para iniciar um trabalho em um ou mais computadores, o trabalho consistirá em um trabalho pai executivo e um trabalho filho para cada trabalho executado em cada computador.
Quando você usar o Invoke-Command para executar um comando Start-Job em um ou mais computadores remotos, o resultado será igual ao de um comando local executado em cada computador remoto. O comando retorna um objeto de trabalho para cada computador. O objeto de trabalho consiste em um trabalho pai executivo em um trabalho filho que executa o comando.
O trabalho pai representa todos os trabalhos filho. Quando você gerencia um trabalho pai, também gerencia os trabalhos filho associados. Por exemplo, se você interromper um trabalho pai, todos os trabalhos filho serão interrompidos. Se você receber os resultados de um trabalho pai, obterá os resultados de todos os trabalhos filho.
No entanto, você também pode gerenciar trabalhos filho individualmente. Isso é mais útil quando você deseja investigar um problema com um trabalho ou obter os resultados de apenas um dos vários trabalhos filho iniciado usando o parâmetro AsJob do Invoke-Command. (O caractere backtick [`] é o caractere de continuação).
O comando a seguir usa o parâmetro AsJob do Invoke-Command para iniciar trabalhos em segundo plano no computador local e em dois computadores remotos. O comando salva o trabalho na variável $j.
PS C:> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob
Quando você exibe as propriedades Name e ChildJob do trabalho em $j, ele mostra que o comando retornou um objeto de trabalho com três trabalhos filho, um para cada computador.
CPS C:> $j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
Quando você exibe o trabalho pai, ele mostra que o trabalho falhou.
C:\PS> $j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
Mas quando você executa um comando Get-Job que obtém os trabalhos filho, a saída mostra que somente um trabalho filho falhou.
PS C:\> Get-Job -IncludeChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 RemotingJob Failed False localhost,Server...
4 Job4 Completed True localhost Get-Date
5 Job5 Failed False Server01 Get-Date
6 Job6 Completed True Server02 Get-Date
Para obter os resultados de todos os trabalhos filho, use o cmdlet Receive-Job para obter os resultados do trabalho pai. No entanto, você também pode obter os resultados de um trabalho filho específico, conforme exibido no comando a seguir.
C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
O recurso de trabalhos filho dos trabalhos em segundo plano do Windows PowerShell oferece mais controle sobre os trabalhos que você executa.
TIPOS DE TRABALHO
O Windows PowerShell dá suporte a diferentes tipos de trabalhos para tarefas diferentes. A partir do Windows PowerShell 3.0, os desenvolvedores podem gravar "adaptadores de fonte de trabalho" que adicionam novos tipos de trabalho ao Windows PowerShell e que incluem os adaptadores de fonte dos trabalhos em módulos. Quando você importar o módulo, poderá usar o novo tipo de trabalho em sua sessão.
Por exemplo, o módulo PSScheduledJob adiciona trabalhos agendados e, o PSWorkflow, adiciona tarefas de fluxo de trabalho.
Os tipos de trabalhos personalizados podem diferir significativamente dos trabalhos padrão em segundo plano do Windows PowerShell. Por exemplo, os trabalhos agendados são salvos no disco; eles não existem apenas em uma determinada sessão. As tarefas de fluxo de trabalho podem ser suspensas e retomadas.
Os cmdlets que você usa para gerenciar trabalhos personalizados dependem do tipo de trabalho. Para alguns, você deve usar os cmdlets de trabalho padrão, como Get-Job e Start-Job. Outros vêm com cmdlets especializados que gerenciar somente um determinado tipo de trabalho. Para obter informações detalhadas sobre os tipos de trabalho personalizados, consulte os tópicos de ajuda sobre o tipo de trabalho.
Para localizar o tipo de um trabalho, use o cmdlet Get-Job. O Get-Job retorna objetos de trabalho diferentes para diferentes tipos de trabalhos. O valor da propriedade PSJobTypeName dos objetos de trabalho que o Get-Job retorna o tipo de trabalho.
A tabela a seguir lista os tipos de trabalho que acompanham o Windows PowerShell.
Job Type Description
-------- -----------
BackgroundJob Started by using the Start-Job cmdlet.
RemoteJob Started by using the AsJob parameter of the
Invoke-Command cmdlet.
PSWorkflowJob Started by using the AsJob parameter of a
workflow.
PSScheduledJob An instance of a scheduled job started by
a job trigger.
CIMJob Started by using the AsJob parameter of
a cmdlet from a CDXML module.
WMIJob Started by using the AsJob parameter of
a cmdlet from a WMI module.
PSEventJob Created by running Register-ObjectEvent
and specifying an action with the Action
parameter.
OBSERVAÇÃO:
Antes de usar o cmdlet Get-Job para obter trabalhos de um tipo específico, verifique se o módulo que adiciona o tipo de trabalho é importado para a sessão atual. Caso contrário, o Get-Job não obtém trabalhos desse tipo.
EXEMPLO
Os seguintes comandos criam um trabalho local em segundo plano, um trabalho remoto em segundo plano, uma tarefa de fluxo de trabalho e um trabalho agendado. Em seguida, ele usa o cmdlet Get-Job para obter os trabalhos. O Get-Job não obterá o trabalho agendado, mas obterá todas as suas instâncias iniciadas.
# Start a background job on the local computer.
PS C:\> Start-Job -Name LocalData {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Running True localhost Get-Process
# Start a background job that runs on a remote computer.
PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
# Create a scheduled job
PS C:\> Register-ScheduledJob -Name ScheduledJob -ScriptBlock {Get-Process} `
-Trigger (New-JobTrigger -Once -At "3 PM")
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True
# Create a workflow.
PS C:\> workflow Test-Workflow {Get-Process}
# Run the workflow as a job.
PS C:\> Test-Workflow -AsJob -JobName TestWFJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 TestWFJob PSWorkflowJob NotStarted True localhost Get-Process
# Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
instances of the scheduled job that are started.
PS C:\> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Completed True localhost Get-Process
4 RemoteData RemoteJob Completed True Server01 Get-Process
6 TestWFJob PSWorkflowJob Completed True localhost WorkflowJob
8 ScheduledJob PSScheduledJob Completed True localhost Get-Process
# To get scheduled jobs, use the Get-ScheduledJob cmdlet.
PS C:\> Get-ScheduledJob
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True
CONSULTE TAMBÉM
about_Jobs
about_Remote_Jobs
about_Remote
about_Scheduled_Jobs
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
Suspend-Job
Resume-Job
New-PSSession
Enter-PSSession
Exit-PSSession
Register-ScheduledJob
Get-ScheduleJob