Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Breve descrição
Descreve como executar trabalhos em segundo plano em computadores remotos.
Descrição longa
O PowerShell executa comandos e scripts simultaneamente por meio de trabalhos. Há três tipos de trabalhos fornecidos pelo PowerShell para dar suporte à simultaneidade.
-
RemoteJob- Comandos e scripts são executados em uma sessão remota. -
BackgroundJob- Comandos e scripts são executados em um processo separado na máquina local. Para obter mais informações, veja about_Jobs. -
PSTaskJobouThreadJob- Comandos e scripts são executados em um thread separado dentro do mesmo processo na máquina local. Para obter mais informações, consulte about_Thread_Jobs.
A execução de scripts remotamente, em uma máquina separada ou em um processo separado, fornece um ótimo isolamento. Quaisquer erros que ocorram no trabalho remoto não afetam outros trabalhos em execução ou a sessão pai que iniciou o trabalho. No entanto, a camada de comunicação remota adiciona sobrecarga, incluindo serialização de objeto. Todos os objetos são serializados e desserializados à medida que são passados entre a sessão pai e a sessão remota (trabalho). A serialização de grandes objetos de dados complexos pode consumir grandes quantidades de recursos de computação e memória e transferir grandes quantidades de dados pela rede.
Importante
A sessão pai que criou o trabalho também monitora o status do trabalho e coleta dados de pipeline. O processo filho do trabalho é encerrado pelo processo pai assim que o trabalho atinge um estado concluído. Se a sessão pai for encerrada, todos os trabalhos filho em execução serão encerrados juntamente com seus processos filho.
Há duas maneiras de contornar essa situação:
- Use
Invoke-Commandpara criar trabalhos que são executados em sessões desconectadas. Consulte a seção Processos separados deste artigo. - Use
Start-Processpara criar um novo processo em vez de um trabalho. Para obter mais informações, consulte Start-Process.
Trabalhos remotos
Você pode executar trabalhos em computadores remotos usando três métodos diferentes.
Inicie uma sessão interativa em um computador remoto. Em seguida, inicie um trabalho na sessão interativa. Os procedimentos são os mesmos que executar um trabalho local, embora todas as ações sejam executadas no computador remoto.
Execute um trabalho em um computador remoto que retorna seus resultados para o computador local. Use esse método quando quiser coletar os resultados de trabalhos e mantê-los em um local central no computador local.
Execute um trabalho em um computador remoto que mantenha seus resultados no computador remoto. Use esse método quando os dados do trabalho forem mantidos com mais segurança no computador de origem.
Iniciar um trabalho numa sessão interativa
Você pode iniciar uma sessão interativa com um computador remoto e, em seguida, iniciar um trabalho durante a sessão interativa. Para obter mais informações sobre sessões interativas, consulte about_Remote e consulte Enter-PSSession.
O procedimento para iniciar um trabalho em uma sessão interativa é quase idêntico ao procedimento para iniciar um trabalho em segundo plano no computador local. No entanto, todas as operações ocorrem no computador remoto, não no computador local.
Use o
Enter-PSSessioncmdlet para iniciar uma sessão interativa com um computador remoto. Você pode usar o parâmetro ComputerName deEnter-PSSessionpara estabelecer uma conexão temporária para a sessão interativa. Ou, você pode usar o parâmetro Session para executar a sessão interativa em uma sessão do PowerShell (PSSession).O comando a seguir inicia uma sessão interativa no computador Server01.
C:\PS> Enter-PSSession -ComputerName Server01O prompt de comando é alterado para mostrar que agora você está conectado ao computador Server01.
Server01\C:>Para iniciar um trabalho remoto na sessão, use o
Start-Jobcmdlet. O comando a seguir executa um trabalho remoto que obtém os eventos no log de eventos do Windows PowerShell no computador Server01. OStart-Jobcmdlet retorna um objeto que representa o trabalho.Este comando salva o objeto de trabalho na
$jobvariável.Server01\C:> $job = Start-Job -ScriptBlock { Get-EventLog "Windows PowerShell" }Enquanto o trabalho é executado, você pode usar a sessão interativa para executar outros comandos, incluindo outros trabalhos. No entanto, você deve manter a sessão interativa aberta até que o trabalho seja concluído. Se você terminar a sessão, o trabalho será interrompido e os resultados serão perdidos.
Para descobrir se o trabalho está concluído, exiba o
$jobvalor da variável ou use oGet-Jobcmdlet para obter o trabalho. O comando a seguir usa oGet-Jobcmdlet para exibir o trabalho.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-EventLog "Windows...A
Get-Jobsaída mostra que o trabalho está sendo executado no computador "localhost" porque o trabalho foi iniciado e está sendo executado no mesmo computador (neste caso, Server01).Para obter os resultados do trabalho, use o
Receive-Jobcmdlet. Você pode exibir os resultados na sessão interativa ou salvá-los em um arquivo no computador remoto. O comando a seguir obtém os resultados do trabalho na variável $job. O comando usa o operador de redirecionamento (>) para salvar os resultados do trabalho no arquivo PsLog.txt no computador Server01.Server01\C:> Receive-Job $job > C:\logs\PsLog.txtPara encerrar a sessão interativa, use o
Exit-PSSessioncmdlet. O prompt de comando é alterado para mostrar que você está de volta à sessão original no computador local.Server01\C:> Exit-PSSession C:\PS>Para exibir o
PsLog.txtconteúdo do arquivo no computador Server01 a qualquer momento, inicie outra sessão interativa ou execute um comando remoto. Esse tipo de comando é melhor executado em uma PSSession (uma conexão persistente) caso você queira usar vários comandos para investigar e gerenciar osPsLog.txtdados no arquivo. Para obter mais informações sobre PSSessions, consulte about_PSSessions.Os comandos a seguir usam o
New-PSSessioncmdlet para criar um PSSession conectado ao computador Server01 e usam oInvoke-Commandcmdlet para executar umGet-Contentcomando no PSSession para exibir o conteúdo do arquivo.$s = New-PSSession -ComputerName Server01 Invoke-Command -Session $s -ScriptBlock { Get-Content C:\logs\pslog.txt}
Iniciar um trabalho remoto que retorna os resultados para o computador local (AsJob)
Para iniciar um trabalho em um computador remoto que retorna os resultados do comando para o computador local, use o parâmetro AsJob de um cmdlet como o Invoke-Command cmdlet.
Quando você usa o parâmetro AsJob , o objeto de trabalho é realmente criado no computador local, mesmo que o trabalho seja executado no computador remoto. Quando o trabalho é concluído, os resultados são retornados para o computador local.
Você pode usar os cmdlets que contêm o substantivo Job (os cmdlets Job) para gerenciar qualquer trabalho criado por qualquer cmdlet. Muitos dos cmdlets que têm parâmetros AsJob não usam a comunicação remota do PowerShell, portanto, você pode usá-los mesmo em computadores que não estão configurados para comunicação remota e que não atendem aos requisitos para comunicação remota.
O comando a seguir usa o parâmetro AsJob de
Invoke-Commandpara iniciar um trabalho no computador Server01. O trabalho executa umGet-Eventlogcomando que obtém os eventos no log do sistema. Você pode usar o parâmetro JobName para atribuir um nome para exibição ao trabalho.Invoke-Command -ComputerName Server01 -ScriptBlock { Get-EventLog System} -AsJobOs resultados do comando são semelhantes à saída de exemplo a seguir.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-EventLog SystemQuando o parâmetro AsJob é usado,
Invoke-Commandretorna o mesmo tipo de objeto de trabalho queStart-Jobretorna. Você pode salvar o objeto de trabalho em uma variável ou pode usar umGet-Jobcomando para obter o trabalho.Observe que o valor da propriedade Location mostra que o trabalho foi executado no computador Server01.
Para gerenciar um trabalho iniciado usando o parâmetro AsJob do
Invoke-Commandcmdlet, use os cmdlets Job. Como o objeto de trabalho que representa o trabalho remoto está no computador local, não é necessário executar comandos remotos para gerenciar o trabalho.Para determinar se o trabalho está concluído, use um
Get-Jobcomando. O comando a seguir obtém todos os trabalhos que foram iniciados na sessão atual.Get-JobComo o trabalho remoto foi iniciado na sessão atual, um comando local
Get-Jobobtém o trabalho. A propriedade State do objeto de trabalho mostra que o comando foi concluído com êxito.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-EventLog SystemPara obter os resultados do trabalho, use o
Receive-Jobcmdlet. Como os resultados do trabalho são retornados automaticamente para o computador onde o objeto de trabalho reside, você pode obter os resultados com um comando localReceive-Job.O comando a seguir usa o
Receive-Jobcmdlet para obter os resultados do trabalho. Ele usa o ID da sessão para identificar o trabalho. Este comando salva os resultados do trabalho na variável $results. Você também pode redirecionar os resultados para um arquivo.$results = Receive-Job -Id 1
Iniciar um trabalho remoto que mantém os resultados no computador remoto
Para iniciar um trabalho em um computador remoto que mantém os resultados do comando no computador remoto, use o Invoke-Command cmdlet para executar um Start-Job comando em um computador remoto. Você pode usar esse método para executar trabalhos em vários computadores.
Quando você executa um Start-Job comando remotamente, o objeto de trabalho é criado no computador remoto e os resultados do trabalho são mantidos no computador remoto.
Do ponto de vista do trabalho, todas as operações são locais. Você está apenas executando comandos remotamente para gerenciar um trabalho local no computador remoto.
Use o
Invoke-Commandcmdlet para executar umStart-Jobcomando em um computador remoto.Este comando requer uma PSSession (uma conexão persistente). Se você usar o parâmetro ComputerName de para estabelecer uma conexão temporária, o
Invoke-Commandcomando será considerado concluído quando o objeto deInvoke-Commandtrabalho for retornado. Como resultado, a conexão temporária é fechada e o trabalho é cancelado.O comando a seguir usa o
New-PSSessioncmdlet para criar uma PSSession conectada ao computador Server01. O comando salva o PSSession na$svariável.$s = New-PSSession -ComputerName Server01O próximo comando usa o
Invoke-Commandcmdlet para executar umStart-Jobcomando no PSSession. OStart-Jobcomando e oGet-Eventlogcomando estão fechados em chaves.Invoke-Command -Session $s -ScriptBlock { Start-Job -ScriptBlock {Get-EventLog System}}Os resultados assemelham-se à saída de exemplo a seguir.
Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost Get-EventLog SystemQuando você executa um
Start-Jobcomando remotamente,Invoke-Commandretorna o mesmo tipo de objeto de trabalho queStart-Jobretorna. Você pode salvar o objeto de trabalho em uma variável ou pode usar umGet-Jobcomando para obter o trabalho.Observe que o valor da propriedade Location mostra que o trabalho foi executado no computador local, conhecido como "LocalHost", mesmo que o trabalho tenha sido executado no computador Server01. Como o objeto de trabalho é criado no computador Server01 e é executado no mesmo computador, ele é considerado um trabalho em segundo plano local.
Para gerenciar um trabalho remoto, use os cmdlets Job . Como o objeto de trabalho está no computador remoto, você precisa executar comandos remotos para obter, parar, aguardar ou recuperar os resultados do trabalho.
Para ver se o trabalho está concluído, use um
Invoke-Commandcomando para executar umGet-Jobcomando no PSSession que está conectado ao computador Server01.Invoke-Command -Session $s -ScriptBlock {Get-Job}O comando retorna um objeto de trabalho. A propriedade State do objeto de trabalho mostra que o comando foi concluído com êxito.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-EventLog SystemPara obter os resultados do trabalho, use o
Invoke-Commandcmdlet para executar umReceive-Jobcomando no PSSession conectado ao computador Server01.O comando a seguir usa o
Receive-Jobcmdlet para obter os resultados do trabalho. Ele usa o ID da sessão para identificar o trabalho. Este comando salva os resultados do$resultstrabalho na variável. Ele usa o parâmetro Keep de para manter o resultado no cache deReceive-Jobtarefas no computador remoto.$results = Invoke-Command -Session $s -ScriptBlock { Receive-Job -SessionId 2 -Keep }Você também pode redirecionar os resultados para um arquivo no computador local ou remoto. O comando a seguir usa um operador de redirecionamento para salvar os resultados em um arquivo no computador Server01.
Invoke-Command -Session $s -Command { Receive-Job -SessionId 2 > C:\logs\pslog.txt }
Como executar como um processo separado
Como mencionado anteriormente, quando a sessão pai é encerrada, todos os trabalhos filho em execução são encerrados juntamente com seus processos filho. Você pode usar a comunicação remota na máquina local para executar trabalhos que não estão anexados à sessão atual do PowerShell.
Crie uma nova sessão do PowerShell na máquina local. O uso Invoke-Command para iniciar um trabalho nesta sessão.
Invoke-Command Permite que você desconecte uma sessão remota e encerre a sessão pai. Mais tarde, você pode iniciar uma nova sessão do PowerShell e conectar-se à sessão desconectada anteriormente para retomar o monitoramento do trabalho. No entanto, todos os dados que foram retornados para a sessão original do PowerShell são perdidos quando essa sessão é encerrada. Somente novos objetos de dados gerados após a desconexão são retornados quando reconectados.
# Create remote session on local machine
PS> $session = New-PSSession -Cn localhost
# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Running True localhost 1..60 | % { sleep 1; ...
# Disconnect the job session
PS> Disconnect-PSSession $session
Id Name Transport ComputerName ComputerType State ConfigurationName Availability
-- ---- --------- ------------ ------------ ----- ----------------- ------------
1 Runspace1 WSMan localhost RemoteMachine Disconnected Microsoft.PowerShell None
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Disconnected True localhost 1..60 | % { sleep 1;
# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...
Neste exemplo, os trabalhos ainda estão anexados a uma sessão pai do PowerShell.
No entanto, a sessão pai não é a sessão original do PowerShell onde Invoke-Command foi executada.