11Sep
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.