Pagina inicial » como » Geek School trabalhando com coleções no PowerShell

    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.