Geek School trabalhando com coleções no PowerShell
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 como 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 sobre o 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 | Parar Processo
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
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 matriz. Sempre que você tiver um cmdlet que ofereça suporte a operações em lote dessa maneira, use-o. Esta é a escolha número um.
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.
Get-WmiObject -Class Win32_Process | Get-Member
Parece que a coisa mais próxima a parar é o método terminate, de modo que deve ser o único. Para chamar um método em um Objeto WMI, você simplesmente canaliza-o para Invoke-WmiMethod e especifica o nome do método.
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name Terminate
Ótimo, isso fez o truque. 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 parar um único processo.
Get-Process | Método Get-Member -MemberType
Perfeito, parece que podemos usar o método Kill e depois canalizar para 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.
Resumo
Escolha One
Get-Process -Name notepad | Parar Processo
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 por esse tempo pessoal, até a próxima semana para mais diversão do PowerShell.