Windows PowerShell: Nova sintaxe no novo shell

Alguns comandos da nova sintaxe do Windows PowerShell versão 3 ajudam a escrever comandos mais fáceis de ler, mas limitados.

Don Jones

Um dos novos recursos no Windows PowerShell versão 3 é uma nova forma de sintaxe dos cmdlets Where-Object e ForEach-Object. Ambos esses cmdlets aceitam normalmente um scriptblock (no caso de Where-Object, é chamado um filterscript, porque ela deve retornar $True ou $False).

Dentro desse scriptblock, você use o símbolo de marcador de posição de _ $ para representar "tudo o que foi canalizado para o cmdlet." Aqui está um exemplo usando os cmdlets (este não é um comando sensato do mundo real, mas ele demonstra o uso dos cmdlets):

Get-WmiObject –class Win32_LogicalDisk | Where-Object –filterscript{ $_.DriveType –eq 3 } | ForEach-Object –process { $_.ChkDsk() }

Você nunca verá esses comandos escritos esta maneira. As pessoas tendem a usar apelidos, nomes de parâmetro truncado e parâmetros posicionais para economizar digitação. O seguinte não é incomum:

gwmi Win32_LogicalDisk | ? { $_.DriveType –eq 3 } | % { $_.ChkDsk() }

Há nada como um pouco de sintaxe Arcana para garantir a segurança do trabalho, direito? Novo sintaxe do objeto onde permite que você faça isso:

gwmi Win32_LogicalDisk | where DriveType –eq 3 | % { $_.ChkDsk() }

Aviso que eu comutado para um alias diferente do cmdlet. Você ainda pode usar? Se você quiser, mas que me deixa louco. Venho de um fundo muito básico, onde? foi um atalho para a instrução de imprimir. Leitura? em um Windows PowerShell comando dói meu cérebro. Eu tenho também dispensar as chaves e o símbolo de _ $.

Essencialmente, Where-Object tem agora um parâmetro posicional para aceitar a propriedade que você deseja filtrar (DriveType, no meu exemplo). Ele define todos os principais operadores de Windows PowerShell (- eq, - ne, - como, - gt e assim por diante) como parâmetros. O valor para esse parâmetro é o valor que você deseja filtrar para (aqui, o valor é 3). Esta forma abreviada é mais fácil de ler, mas você só pode usá-lo para uma simples comparação. Por exemplo, não a seguir é uma declaração legal:

Gwmi Win32_Service | Where StartMode –eq 'Auto' –and State –ne 'Running'

Para isso, você terá que voltar para a velha escola sintaxe:

Gwmi Win32_Service | Where { $_.StartMode –eq 'Auto' –and $_.State –ne 'Running' }

ForEach-Object Obtém uma forma de sintaxe similar, uma redução de sinais de Pontuação:

gwmi Win32_LogicalDisk | where DriveType –eq 3 | foreachChkDsk()

Mais uma vez, já mudei para o alias de ForEach em vez de % para tornar isso mais fácil de ler. Você poderia continuar usando % se desejar. Um dos meus colegas MVPs escreveu um grande blog artigo sobre estes formulários encurtados, e vale a pena uma leitura. Ele também introduz $PSItem, que parece ser uma alternativa para o símbolo de _ $ muitas vezes incompreendido.

Pessoalmente, eu tenho sentimentos mistos sobre estas novas formas de sintaxe. Por um lado, eles estão definitivamente mais fácil para um recém-chegado a agarrar. Eliminar as chaves e a sempre confusa $_ é grande. Por outro lado, essas novas formas não são totalmente funcionais. Eles só podem fazer uma comparação simples. Você ainda precisará aprender a sintaxe antiga.

Além disso, há mais de seis anos de sintaxe antiga flutuando no popular blogs, artigos de revistas e livros. Você ainda vai precisar saber a sintaxe antiga, a fim de dar sentido a esses exemplos.

Assim esta nova sintaxe não elimina a necessidade de saber a sintaxe antiga. Apenas significa que você tem duas formas de lembrar em vez de um. No entanto, é o que temos de trabalhar com, assim que é o caminho que vamos trabalhar.

Don Jones

Don Jones  é um Microsoft MVP Award destinatário e autor de "Aprender Windows PowerShell em um mês de almoços" (Manning Publications, 2011), um livro concebido para ajudar a qualquer administrador tornam-se eficazes com o Windows PowerShell. Jones também oferece treinamento de Windows PowerShell público e no local. Entre em contato com ele através de ConcentratedTech.com ou bit.ly/AskDon.

Conteúdo relacionado