escola do geek: aprender a usar empregos no PowerShell

PowerShell tem quatro tipos de trabalhos – Jobs fundo, trabalhos remotos, WMI postos de trabalho e tarefas agendadas. Junte-se a nós descobrir o que eles são e como podemos usá-los.

Certifique-se de ler os artigos anteriores da série

E fique atento para o resto da série durante toda a semana.

Até agora tudo o que eu lhe mostrei dentro PowerShell foi sincronizada, o que significa que digitar algo no shell e realmente não pode fazer muito até que o comando terminar a execução. Este é onde os trabalhos de fundo entrar. Para iniciar um fundo, trabalho simplesmente passar um bloco de script para o cmdlet Start-Job.

Start-Job -Name GetFileList -ScriptBlock {Get-ChildItem C: \ -Recurse}

Agora somos livres para fazer o que quisermos dentro da concha, enquanto que o bloco script é executado em segundo plano.

Quando você começar um novo emprego, PowerShell cria um novo objeto de trabalho que representa esse trabalho. Você pode obter uma lista de todos os postos de trabalho a qualquer momento, executando o cmdlet Get-Job.

Os objetos de trabalho informá-lo sobre o status dos trabalhos. Por exemplo, na imagem acima, podemos ver que temos um BackgroundJob chamado GetFileList que ainda está em execução, mas já começou a retornar dados. Se em algum momento você decidir que o trabalho foi executado por muito tempo, você pode facilmente parar com isso, canalizando-o para Stop-Job.

Get-Job -Name GetFileList | Stop-Job

No entanto, depois de ter parado um trabalho, todos os dados que recebeu até o ponto em que parou ainda está disponível. Há uma pegadinha, porém. Em PowerShell, uma vez que você receber os resultados de um trabalho, eles são apagados. No fim de que para permanecer, você deve especificar o parâmetro de opção keep de Receive-Job.

Get-Job -Name GetFileList | Receive-Job -Manter

Uma vez que você terminar com um trabalho, ele é a melhor prática para removê-lo. Para remover o trabalho, simplesmente canalizá-lo para o cmdlet Remove-Job.

Get-Job -Name GetFileList | Remove-Job

Isto irá removê-lo da lista de trabalhos que são retornadas por Get-Job.

Algumas lições atrás, vimos como podemos usar a comunicação remota para executar comandos PowerShell em um computador remoto usando Invoke-Command, mas você sabia que você também pode usar Invoke-Command para iniciar um trabalho de comunicação remota no fundo? Para isso, basta adicionar o parâmetro -AsJob para o final do seu comando

Invocar-Command -ComputerName Flash, Viper -Credential administrador -ScriptBlock {GCI} -AsJob

Isso foi um comando simples e deveria ter terminado a execução até agora, então vamos dar uma olhada em nosso status empregos.

Hmm, parece que ele falhou. Isto leva-me para a minha primeira pegadinha com postos de trabalho. Quando você cria um novo emprego de qualquer tipo em PowerShell, cria-se um trabalho pai, além de um trabalho de criança para cada computador que você está executando o trabalho contra. Quando você usa o cmdlet Get-Job, ele só mostra os trabalhos pai, ea propriedade do Estado é o pior cenário possível, o que significa que mesmo que o comando só não conseguiu rodar em um fora de uma centena de computadores, o estado de trabalhos pai vai dizer falhou. Para ver uma lista de tarefas filho que você precisa para usar o parâmetro IncludeChildJob.

Se você olhar mais de perto, você vai ver que o trabalho, de fato, só não em um computador, o que nos leva para a próxima pegadinha. Quando você tentar e obter os resultados para o trabalho, se você especificar o nome do trabalho do pai ou ID, PowerShell retornará os dados de todas as tarefas filho. O problema é que, se houver um erro em uma das tarefas filho, vamos ficar com algum texto vermelho.

Há duas maneiras de contornar isso. Em primeiro lugar, se você sabe o que os computadores que você deseja que os resultados para, você pode simplesmente usar o parâmetro ComputerName do cmdlet Recieve -Job.

Get-Job -Id 3 | Receive-Job -Manter -ComputerName Viper

Alternativamente, você pode obter os resultados de um trabalho de criança específica usando o seu ID de trabalho.

Get-Job -Id 3 -IncludeChildJob

Get-Job -Id 5 | Receive-Job -Manter

Jobs WMI são praticamente os mesmos que Jobs remoto, exigindo apenas o parâmetro -AsJob a ser adicionada ao cmdlet Get-WmiObject.

Infelizmente, isto significa que eles também estão sujeitos aos mesmos armadilhas I mencionados na secção Candidatura remoto.

Os últimos três tipos de trabalhos que examinamos não foram persistentes, o que significa que eles só estão disponíveis em sua sessão atual. Basicamente, isso significa que se você começar um trabalho e, em seguida, abrir outra Console PowerShell e executar-se-Job, você não vai ver qualquer postos de trabalho. No entanto, voltar para o console que você chutou o trabalho fora de, você será capaz de ver o seu estado. Isso está em contraste com trabalhos agendados que sejam persistentes. Basicamente, uma tarefa agendada é um bloco de script que é executado em uma programação. No passado, o mesmo efeito poderia ter sido alcançado usando o Agendador de Tarefas do Windows, que é realmente o que está acontecendo debaixo do capô. Para criar um novo trabalho agendado, nós fazemos o seguinte

Registre-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Segurança -Newest 100} -Trigger (New-JobTrigger -Daily -No 17:00) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)

Há muita coisa acontecendo nesse comando, então vamos dividi-la.

Uma vez que este é um tipo ligeiramente diferente de trabalho, 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 que existe para ela.

Como você sabe qual a versão do PowerShell que você tem?

PS C: \ Users \ Administrator> $ PSVersionTable

Resposta Encontrado por Poster.

Valor nome

3.0PSCompatibleVersions WSManStackVersion {1.0, 2.0, 3.0} SerializationVersion 1.1.0.1BuildVersion 6.2.9200.16398PSVersion 3.0CLRVersion 4.0.30319.296PSRemotingProtocolVersion 2.2

A cada 100 anos, pular um dia bissexto para corrigir a overcorrection criada pela rotina regular de adição de um dia bissexto a cada ano, a menos que a quarta do ano é divisível por 400, como no caso dos anos de 1600, 2000 e 2400.