Geek School: trabalhando com coleções no PowerShell

Índice:

Geek School: trabalhando com coleções no PowerShell
Geek School: trabalhando com coleções no PowerShell

Vídeo: Geek School: trabalhando com coleções no PowerShell

Vídeo: Geek School: trabalhando com coleções no PowerShell
Vídeo: Como procurar e instalar programas do repositório no Ubuntu pelo terminal | Tutorial Linux - YouTube 2024, Novembro
Anonim
Como o PowerShell é baseado no.Net Framework e incorpora várias outras tecnologias, como o WMI e o CIM, há sempre mais de uma maneira de realizar a mesma coisa. Venha se juntar a nós para este post curto, onde aprendemos a escolher o melhor método para realizar nossas tarefas.
Como o PowerShell é baseado no.Net Framework e incorpora várias outras tecnologias, como o WMI e o CIM, há sempre mais de uma maneira de realizar a mesma coisa. Venha se juntar a nós para este post curto, onde aprendemos a escolher o melhor método para realizar nossas tarefas.

Não deixe de ler os artigos anteriores da série:

  • Aprenda a automatizar o Windows com o PowerShell
  • Aprendendo a usar cmdlets no PowerShell
  • Aprendendo a usar objetos no PowerShell
  • Aprendendo a formatar, filtrar e comparar no PowerShell
  • Aprenda a usar o Remoting no PowerShell
  • Usando o PowerShell para obter informações do computador

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

Usando Cmdlets em lote

Anteriormente na série, quando apresentamos o pipeline, mostramos como você pode pegar os objetos que um cmdlet gera e passá-los como entrada para outro cmdlet usando algo parecido com isto:

Get-Process -Name notepad | Stop-Process

Isso mataria qualquer processo com o nome "notepad". Mas provavelmente você 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.

help Stop-Process –Full

Image
Image

Se você observar a última linha de código na seção de sintaxe, verá que o parâmetro InputObject aceita um objeto do tipo Process e sempre que você vir um tipo seguido por dois colchetes como esse, isso significa que o parâmetro aceita um ou mais do tipo anterior. Neste caso, 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 em lote dessa maneira, use-o. Esta é a primeira escolha.

Usando o WMI

Embora o WMI não seja a melhor peça de tecnologia fornecida pelo Microsoft HQ, ele aparece em segundo lugar na lista de como trabalhar com coleções de objetos. Poderíamos obter facilmente uma lista de processos em execução da classe Win32_Process da seguinte forma:

Get-WmiObject –Class Win32_Process

Como a consulta do WMI retorna seu próprio tipo de objeto, você precisará procurar um método que possa interromper o processo, portanto, vamos canalizar isso para Get-Member.
Como a consulta do WMI retorna seu próprio tipo de objeto, você precisará procurar um método que possa interromper o processo, portanto, vamos canalizar isso para Get-Member.

Get-WmiObject –Class Win32_Process | Get-Member

Parece que a coisa mais próxima a parar é o método de terminação, de modo que deve ser o único. Para chamar um método em um Objeto WMI, basta canalizá-lo para Invoke-WmiMethod e especificar o nome do método.
Parece que a coisa mais próxima a parar é o método de terminação, de modo que deve ser o único. Para chamar um método em um Objeto WMI, basta canalizá-lo para Invoke-WmiMethod e especificar o nome do método.

Get-WmiObject -Class Win32_Process -Filter “name=’notepad.exe'” | Invoke-WmiMethod -Name Terminate

Ótimo, isso funcionou. Sempre que você obtiver um ReturnValue de 0 no WMI, lembre-se de que o comando foi executado com êxito.
Ótimo, isso funcionou. Sempre que você obtiver um ReturnValue de 0 no WMI, lembre-se de que o comando foi executado com êxito.

Enumeração

Na falta dos outros dois métodos, se você tiver que fazer algo com vários objetos, você pode enumerar o objeto inteiro e agir em cada objeto individual. Primeiro você tem que encontrar o método que você usaria para interromper um único processo.

Get-Process | Get-Member -MemberType Method

Perfeito, parece que podemos usar o método Kill e depois canalizar para o ForEach-Object para matar todos eles.
Perfeito, parece que podemos usar o método Kill e depois canalizar para o ForEach-Object para matar todos eles.

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

Aqui, pegamos todos os objetos de processo retornados pelo Get-Process e os passamos para o cmdlet ForEach-Object. Assim como o cmdlet Where-Object, representamos cada objeto no pipeline com $ , que conseguimos chamar no método Kill (). Com tudo isso dito e feito, enumerar uma coleção é muito mais lento do que os métodos acima e só deve ser usado como último resultado.
Aqui, pegamos todos os objetos de processo retornados pelo Get-Process e os passamos para o cmdlet ForEach-Object. Assim como o cmdlet Where-Object, representamos cada objeto no pipeline com $ , que conseguimos chamar no método Kill (). Com tudo isso dito e feito, enumerar uma coleção é muito mais lento do que os métodos acima e só deve ser usado como último resultado.

Resumo

Escolha One

Get-Process -Name notepad | Stop-Process

Escolha dois

Get-WmiObject -Class Win32_Process -Filter “name=’notepad.exe'” | Invoke-WmiMethod -Name Terminate

Escolha três

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

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

Recomendado: