Windows PowerShell: Sintaxe de atalho

Normalmente, existem diversas maneiras de se fazer a mesma coisa no Windows PowerShell. Encontre a mais adequada para você e fique com ela.

Don Jones

Uma das coisas que eu amo e odeio sobre o Windows PowerShell é a sua flexibilidade inerente. Em muitos aspectos, é escrito como uma linguagem de programação. Se você não for um programador, pode muito bem ignorar que e tratá-lo como um shell de linha de comando.

Bem, talvez não "ignorar completamente." Você vê, sempre parece haver três ou quatro maneiras diferentes de fazer quase qualquer coisa no Windows PowerShell. Você só precisa realmente saber a maneira que faz mais sentido para você. No entanto, um usuário do Windows PowerShell inteligente, estarão familiarizado com todos os meios com que realizar uma determinada tarefa. Dessa forma, quando você está olhando para exemplos escritos por outras pessoas, você será capaz de fazer sentido o que você está vendo.

Tudo sobre o Alias

Os aliases são o primeiro "atalho" a maioria de vocês irá encontrar. Considere este comando:

PS C:\> Get-WmiObject -class Win32_LogicalDisk -Filter "DriveType=3" | >> Where-Object -FilterScript{ $_.FreeSpace / $_.Size -lt .1 } | >> Select-Object -Property DeviceID,FreeSpace,Size >>

Você pode atalho é como assim:

PS C:\>gwmi Win32_LogicalDisk -Fi "DriveType=3" | >> ?{ $_.FreeSpace / $_.Size -lt .1 } | >> SelectDeviceID,FreeSpace,Size >>

Eu usei aliases no lugar dos nomes de comando, e eu tenho truncados parâmetros para menos caracteres. O Windows PowerShell permite que você truncar nomes de parâmetro, contanto que você forneça suficiente de cada nome de parâmetro para que possa ser identificado exclusivamente. Isto faz menos digitação, mas um comando muito mais difícil de ler. Posso aconselhar meus alunos para soletrar tudo quando estiver publicando um exemplo, salvá-lo em um script ou caso contrário tornando-se um artefato permanente. Isto tornará mais fácil para identificar depois.

Na maioria dos outros editores e o Windows PowerShell ISE, você pode digitar a parte truncada do nome do parâmetro e bater guia para terminar de digitar o nome inteiro. Há menos digitação — e é mais fácil de ler. Eu omiti totalmente outros nomes de parâmetro, porque eles são parâmetros posicionais. Em outras palavras, enquanto eu lembre-se de obter todos os valores alinhados na ordem certa, o comando ainda funciona.

Mais uma vez, nomes incompletos não são tão fáceis de ler. A maioria das pessoas irá apreciar você usando o nome de parâmetro completo em um script. Usando os nomes de parâmetro completo é finalmente menos trabalho em você, porque você não tem que lembrar que ordem eles vêm em. Quando você usar nomes, você pode colocá-los em qualquer ordem desejada.

Expressões entre aspas

Ocasionalmente, você precisará inserir um resultado da expressão em uma Cadeia de caracteres entre aspas. Isso permite que você inclua esse resultado na saída do script. Uma maneira de fazer isso é armazenar o resultado em uma variável. Em seguida, use o truque de Windows PowerShell inserção de variáveis em seqüências de caracteres de aspas duplas. O Windows PowerShell irá substituir a variável com seu conteúdo:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" $freepercent = $disk.freespace / $disk.size * 100 Write-Host "Free space on drive C: at $freepercent percent"

O Windows PowerShell também permite que você coloque a expressão completa dentro de aspas duplas. A sintaxe é derivada de um truque de shell do Unix. Parece um pouco estranho, mas você vai ver gente usá-lo muito:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" Write-Host "Free space on drive C: at $($disk.freespace / $disk.size * 100) percent"

Eu prefiro o primeiro formulário, principalmente porque tendem a trabalhar principalmente com iniciantes do Windows PowerShell. O primeiro formulário é um pouco mais fácil de ler. Uma coisa que acontece em cada passo do script, facilitando um pouco a lógica a seguir.

O Windows PowerShell usa suficientes sinais de que a segunda forma parece mais confusa. No entanto, a segunda forma também é tecnicamente um pouco mais eficiente. Ele não está criando uma variável para controlar o Windows PowerShell possui. Envolve também um pouquinho menos digitação, que a maioria de vocês parece gostar.

Criação de objetos

Forma longa novamente vem a calhar quando preciso criar um objeto Personalizar:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version $obj | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer $obj | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model Write-Output $obj

Às vezes eu vou atalho isso um pouco usando esta técnica, que combina os comandos Add-Member em uma tubulação única:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version –PassThru | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer –PassThru | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model –PassThru

Recentemente, eu comecei a mudar para uma técnica ligeiramente diferente, que é ainda mais legível:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $props = @{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model} $obj = New-Object -TypeNamePSObject -Property $props Write-Output $obj

Mais uma vez, minha preferência por este tipo de forma longa sintaxe é por causa da sua legibilidade. Eu trabalho principalmente com os recém-chegados do Windows PowerShell, para que facilitar a leitura é fundamental para ajudá-los a compreender o que está acontecendo. Você também verá gente use este truque:

$obj = Select-Object OSVersion,Mfgr,Model $obj.OSVersion = $os.version $obj.Mfgr = $cs.manufacturer $obj.Model = $cs.model $obj

Os resultados são basicamente os mesmos, e que um passado usa um pouco menos digitação. É tipo de um hacker truque usar Select-Object dessa forma. Ele está aproveitando o fato de que você pode dizer a Select-Object para selecionar uma propriedade inexistente. Ele realmente cria a propriedade, com um valor vazio no objeto de saída.

Ele realmente dói-me ver Select-Object usado (ou, mais precisamente, utilizados de forma abusiva) dessa forma e eu não sou o único. Já em 2008, alguns dos meus colegas MVPs do Windows PowerShell estavam falando contra esse uso. Independentemente de como você se sente sobre essa técnica, você deve aprender a reconhecê-lo assim que você saberá o que ele faz.

No Windows PowerShell versão 3, você vai realmente ser capaz de fazer isso:

[pscustomobject]@{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model}

Eu não decidi como eu sinto sobre essa sintaxe, mas geralmente é OK. Ela ainda é bastante legível e elimina um pouco de digitação. As pessoas vão começar a usá-lo também, assim que você deve reconhecê-lo pelo que ele é. A última técnica também parece executar mais rapidamente (Leia mais sobre ele em Jonathan Agronegócios do blog).

Atalhos de objeto

A última técnica de atalho que você verá muitas vezes é similar a expressões em seqüências de caracteres. Isso é totalmente legal sintaxe de programação — que só pode ser confuso para os recém-chegados. Ainda assim, não há nada de "errado" com ele, assim que você deve se acostumar a vê-lo e saber o que ele faz.

Que você queira executar algum método de um objeto e, em seguida, fazer algo com uma das propriedades do objeto resultante, da seguinte forma:

$string = ' Hello ' $string = $string.Trim() $string.Length

Tudo o que pode atalho usando parênteses. A expressão entre parênteses é avaliada em primeiro lugar, e Windows PowerShell basicamente substitui o parenthetical com seu resultado:

$string = ' Hello ' ($string.Trim()).length

Empilha acima os sinais de pontuação muito, por isso é um pouco mais difícil para o seu cérebro puxe os pedaços e determinar o que está acontecendo, mas é completamente legal. Pode até mesmo executar um pouco mais rápido, porque o Windows PowerShell não tem que manipular a variável como muitas vezes.

Pesaroso sobre tudo o que

De certa forma, é lamentável o Windows PowerShell não poderia oferecer apenas uma maneira de fazer qualquer coisa. Então nós todos só teriam que aprender uma maneira. Como é, temos um escudo que oferece muitas variações de sintaxe diferente para aquilo que é essencialmente a mesma tarefa. Vale a pena, pelo menos, estar familiarizado com as muitas alternativas de sintaxe. Dessa forma, você pode fazer uso de qualquer exemplos você encontrar.

Raymond Chen

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 do ConcentratedTech.com ou bit.ly/AskDon.

Conteúdo relacionado