29Aug
PowerShell tem quatro tipos de trabalhos: trabalhos em segundo plano, trabalhos remotos, trabalhos WMI e trabalhos agendados. Junte-se a nós quando descobrimos o que são e como podemos usá-los.
Certifique-se de ler os artigos anteriores da série:
- Saiba como automatizar o Windows com o PowerShell
- Aprender a usar Cmdlets no PowerShell
- Aprender a usar objetos no PowerShell
- Aprender a formatar, filtrar e comparar no PowerShell
- Aprender a usar Remoting emPowerShell
- Usando o PowerShell para obter informações do computador
- Trabalhando com coleções no PowerShell
E fique atento para o resto da série toda a semana.
Trabalhos em segundo plano
Até agora, tudo o que mostrei no PowerShell foi sincrônico, o que significa que digamos algo no shell e realmente não podemos fazer muito até que o comando termine de executar.É aí que os trabalhos em segundo plano entram. Para iniciar um plano de fundo, o trabalho simplesmente passa um bloco de script para o cmdlet Start-Job.
Start-Job -Name GetFileList -Scriptblock{ Get-ChildItem C: \ -Recurse}
Agora, podemos fazer o que quisermos dentro do shell enquanto esse bloco de script é executado em segundo plano.
Quando você inicia um novo trabalho, o PowerShell cria um novo objeto de trabalho que representa esse trabalho. Você pode obter uma lista de todos os trabalhos a qualquer momento executando o cmdlet Get-Job.
Os objetos do trabalho informam sobre o status dos trabalhos. Por exemplo, na captura de tela acima, podemos ver que temos um BackgroundJob chamado GetFileList que ainda está em execução, mas já começou a retornar dados. Se, em qualquer ponto, você decidir que o trabalho está sendo executado por muito tempo, você pode facilmente detê-lo, encainhando-o para Parar-Trabalhar.
Get-Job -Name GetFileList |Stop-Job
No entanto, uma vez que você parou um trabalho, qualquer dado recebido até o ponto em que você parou ainda está disponível. Há um gotcha, no entanto. No PowerShell, uma vez que você recebe os resultados para um trabalho, eles são excluídos. Para que eles permaneçam, você deve especificar o parâmetro do parâmetro keep de Receive-Job.
Get-Job -Name GetFileList |Receive-Job -Keep
Depois de terminar um trabalho, é recomendável removê-lo. Para remover o trabalho, simplesmente coloque-o no cmdlet Remove-Job.
Get-Job -Name GetFileList |Remove-Job
Isso irá removê-lo da lista de trabalhos que são retornados pelo Get-Job.
Remote Jobs
Algumas lições atrás, nós olhamos para como podemos usar o remoting para executar comandos PowerShell em uma máquina remota usando Invoke-Command, mas você sabia que você também pode usar Invoke-Command para iniciar um trabalho remoting em segundo plano? Para fazer isso, basta adicionar o parâmetro -AsJob no final do seu comando:
Invoke-Command -ComputerName Flash, Viper -Administrador -diretor -ScriptBlock{ gci} -AsJob
Esse foi um comando simples e deveria ter terminado de ser executado até agoraVamos dar uma olhada no nosso status de emprego.
Hmm, parece que falhou. Isso me leva ao meu primeiro arranjo com trabalhos. Quando você cria um novo trabalho de qualquer tipo no PowerShell, ele cria um trabalho pai, além de um trabalho infantil para cada computador com o qual você está executando o trabalho. Quando você usa o cmdlet Get-Job, ele só mostra os trabalhos pai e a propriedade do estado é o pior dos casos, o que significa que, mesmo que o comando falhasse executado apenas em um de cem computadores, o estado do trabalho pai irá dizerfalhou. Para ver uma lista de trabalhos secundários, você precisa usar o parâmetro IncludeChildJob.
Se você olhar mais de perto, você verá que o trabalho realmente falhou apenas em um computador, o que nos leva ao próximo getcha. Quando você tenta obter os resultados para o trabalho, se você especificar o nome do trabalho ou o ID do pai, o PowerShell retornará os dados de todos os trabalhos infantis. O problema é que se houver um erro em um dos trabalhos infantis, vamos ficar com um texto vermelho.
Existem duas maneiras de contornar isso. Em primeiro lugar, se você conhece os computadores para os quais você deseja obter os resultados, você pode simplesmente usar o parâmetro ComputerName do cmdlet Recebir -Job.
Get-Job -Id 3 |Receive-Job -Keep -ComputerName Viper
Alternativamente, você pode obter os resultados de um trabalho infantil específico usando seu ID de trabalho.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 |Receive-Job -Keep
WMI Jobs
WMI Jobs são muito semelhantes aos trabalhos remotos, exigindo apenas o parâmetro -AsJob a ser adicionado ao cmdlet Get-WmiObject.
Infelizmente, isso significa que eles também estão sujeitos às mesmas conquistas que mencionei na seção de Empregos Remotos. Trabalhos programados
Os últimos três tipos de trabalhos que examinamos não foram persistentes, o que significa que eles estão disponíveis apenas na sua sessão atual. Basicamente, isso significa que se você iniciar um trabalho e abrir outro PowerShell Console e executar o Get-Job, você não verá nenhum emprego. No entanto, volte para o console com o qual você expulso, você poderá ver seu status. Isso contrasta com os trabalhos agendados que são persistentes. Basicamente, um trabalho agendado é um bloco de script que é executado em uma programação. No passado, o mesmo efeito poderia ter sido alcançado usando o Windows Task Scheduler, que é realmente o que está acontecendo por baixo do capô.Para criar um novo trabalho agendado, fazemos o seguinte:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock{ Get-EventLog -LogName Security -Newest 100} -Trigger( New-JobTrigger -Daily -At 5pm) -ScheduledJobOption( New-ScheduledJobOption-RunElevado)
Há muito em curso nesse comando, então vamos derrubar isso.
- Primeiro, damos ao nosso trabalho agendado um nome de GetEventLogs.
- Dizemos então que, quando ativado, queremos que ele execute o conteúdo do bloco de script especificado, que obtém basicamente as 100 entradas mais recentes do registro de eventos de segurança.
- Em seguida, especificamos um gatilho. Uma vez que o parâmetro de disparo leva um objeto de gatilho como entrada, usamos um comando entre parênteses para gerar um gatilho que irá desligar todos os dias às 5PM.
- Uma vez que estamos lidando com o registro de eventos, precisamos executar como um administrador, que podemos especificar criando um novo objeto ScheduledJobOption e passando para o parâmetro ScheduledJobOption.
Uma vez que este é um tipo de trabalho ligeiramente diferente, você também precisará usar um comando diferente para recuperar uma lista de todos os trabalhos agendados em uma máquina.
Get-ScheduledJob
Isso é tudo aí.