11Sep

Geek School: trabalhando com coleções no PowerShell

Uma vez que o PowerShell é baseado no. Net Framework e incorpora várias outras tecnologias como WMI e CIM, há sempre mais de uma maneira de realizar a mesma coisa. Venha juntar-se a nós para esta breve publicação onde aprendemos a escolher o melhor método para realizar nossas tarefas.

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
  • Aprendendo formatação, filtragem e comparação no PowerShell
  • Aprenda a usar Remoting emPowerShell
  • Usando o PowerShell para obter informações do computador

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

Usando Cmdlets de Lote

Mais cedo na série, quando apresentamos o pipeline, mostramos como você pode pegar os objetos que um cmdlet produz e passar como entrada para outro cmdlet usando algo como isto:

Get-Process -Bloco de notas de nome |Stop-Process

Isso mataria qualquer processo com o nome "bloco de notas".Mas você provavelmente está se perguntando como o PowerShell é capaz de matar todas as instâncias do bloco de notas com um único comando. A resposta está na ajuda do cmdlet Stop-Process.

ajuda Stop-Process-

total Se você olhar para a última linha de código na seção de sintaxe, você pode ver que o parâmetro InputObject aceita um objeto do tipo Processo [] e sempre que você vê um tipo seguido por dois colchetes comoisso significa que o parâmetro aceita um ou mais do tipo anterior. Nesse caso, ele aceita um ou mais objetos de processo. Tecnicamente, diríamos que o cmdlet InputObject aceita um processo array .Sempre que você tiver um cmdlet que ofereça suporte a operações de lote dessa maneira, use-o. Esta é a escolha número um.

Usando WMI

Embora o WMI não seja a melhor tecnologia para enviar a partir da Microsoft HQ, ele vem em segundo na lista de como trabalhar com coleções de objetos. Poderíamos facilmente obter uma lista de processos em execução a partir da classe Win32_Process como:

Get-WmiObject -Class Win32_Process

Uma vez que a consulta WMI retorna seu próprio tipo de objeto, você precisará buscar um método que possa interromper o processo, entãoDeixa isso para Get-Member.

Get-WmiObject -Class Win32_Process |Get-Member

Parece que a coisa mais próxima a parar é o método de término, então esse deve ser o único. Para chamar um método em um objeto WMI, você simplesmente o canaliza para Invoke-WmiMethod e especifique o nome do método.

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminar

Ótimo, isso fez o truque. Sempre que você obtenha um ReturnValue de 0 no WMI, basta lembrar que o comando foi executado com sucesso.

Enumeração

Falhando os outros dois métodos, se você tiver que fazer algo com um monte de objetos, você pode enumerar todo o objeto e agir em cada objeto individual. Primeiro você deve encontrar o método que você usaria para parar um único processo.

Get-Process |Get-Member -MemberType Método

Perfeito, parece que podemos usar o método Kill e, em seguida, canalizar em ForEach-Object para matá-los todos.

Get-Process -Name notepad |ForEach-Object -Process{ $ _. Kill()}

Aqui nós levamos todos os objetos de processo que o Get-Process retornou e os passou para o cmdlet ForEach-Object. Muito parecido com o cmdlet Where-Object, representamos cada objeto no pipeline com $ _ que pudemos chamar para o método Kill() .Com tudo o que foi dito e feito, enumerar uma coleção é muito mais lento do que os métodos acima e só deve ser usado como um último resultado.

Resumo

Escolha um

Get-Process -Name notepad |Stop-Process

Escolha dois

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminar

Escolha Três

Get-Process -Name notepad |ForEach-Object -Process{ $ _. Kill()}

Isso é tudo por esse tempo pessoal, até a próxima semana para mais diversão no PowerShell.