Powershell para desenvolvedores – Parte 3 – Desvios condicionais e Loops

Posted on março 4, 2011 by elemarjr

0


Olá pessoal, tudo certo?!

Passado algum tempo, voltamos ao Powershell. No primeiro post, apresentei os “primeiros passoas” para utilização dessa ferramenta. Na segundo post, falei sobre operadores e funções. Hoje, vou tratar de desvios condicionais e laços de petição.

Sem mais delongas…

Escrevendo scripts para Powershell

Até aqui, todos os exemplos que foram apresentados eram comandos digitados “um-por-um” no console. Na maioria dos casos é suficiente, em outros tantos não é.

Scripts powershell são salvos em arquivos comuns com extensão .ps1. Você pode criar scripts utilizando o Notepad, se preferir. Eu crio meus scripts usando o PowerShell ISE (que acompanha o Powershell 2). Veja o programa na figura:

image

Como você pode ver, essa janela é dividida em três painéis:

  1. painel de scripts – onde você cria seus arquivos de script;
  2. painel de comando (no meio) – onde você pode digitar comandos powershell isoladamente, da mesma forma que faria no console;
  3. painel de saída (o primeiro, de baixo para cima) – onde são exibidos os resultados de execução dos comandos ou scripts.

Bacana!

Repare que o painel para scripts do powershell suporta “code-completing” e “color-coding”. Além disso, na toolbar você pode perceber algumas ferramentas para apoiar a execução e depuração de scripts. Observe:

image

 

Desvios condicionais simples – if .. elseif .. else

Em powershell, podemos usar desvios condicionais elaborados, semelhantes aos disponíveis em nossas linguagens de programação. Observe:


              
if ($v -lt 5)
{
    "Menor que 5."
}
elseif ($v -lt 15)
{
    "Menor que 15."
}
elseif ($v -lt 40)
{
    "Menor que 40."
}
else
{
    "Whatever!"
}

            

O conceito aqui é simples. Não vou explicar como funciona um if, já que essa série é direcionada para desenvolvedores. A única diferença percebida (mesmo) são os operadores de comparação.

Considere esse exemplo um pouco mais elaborado:


              
if(Get-Process | Where-Object { $_.Name -eq "calc" })
{
    "Windows calc is Running"
}
else
{
    "Windows calc is Not Running"
}

            

Esse pequeno script verifica se a calculadora está em execução. Perceba que todo esse script poderia ser digitado em uma única linha dispensando a criação de um arquivo de script.

Só para lembrar: Para executar um arquivo de script (no meu exemplo, if.ps1) é necessário fazer referência ao diretório em que esse arquivo está salvo, mesmo que seja corrente (ex: “./if.ps1”).

Desvios condicionais com múltipla escolha – Switch

Powershell também fornece suporte a desvios condicionais usando switch. Observe:


              
switch ($v)
{
    {$v -lt 5} { "Menor que 5."; break }
    {$v -lt 15} { "Menor que 15."; break }
    {$v -lt 40} { "Menor que 40."; break }
    40 { "40!"; break }
    default { "Whatever" }
}

            

Como você pode observar, cada “opção de escolha” consiste de dois blocos.

Repetindo blocos de execução – for

O que você acha de usar o bom e velho for do C# no Powershell? Você pode! Observe:


              
for ($counter = 1; $counter -le 10; $counter ++)
{
    "Loop number $counter"
}

            

Veja como é simples. A sintaxe é bem parecida com a que estamos acostumados no C#. Não acha?

Pecorrendo listas – foreach e ForEach-Obejct

Se há for, deve haver foreach. Certo? Certo! Observe:


              
foreach ($file in dir)
{
    "File length: " + $file.Length
}

            

Como você já deve saber, dir é o alias para Get-ChildItem. Há um cmdlet com a mesma função de for, trata-se do ForEach-Object. Observe:


              
dir | ForEach-Object { "File length: " + $_.Length }

            

Repetindo … Repetindo .. – while / do..while / do..until

Outra semelhanca: Powershell suporta while. Observe:


              
$response = ""
while ($response -ne "q")
{
    $response = Read-Host "Type something (q to quit)"
}

            

Também tem do..while. Observe:


              
$response = ""
while ($response -ne "q")
{
    $response = Read-Host "Type something (q to quit)"
}

            

E vai além: temos o do..until. Observe:


              
do
{
    $response = Read-Host "Type something (q to quit)"
} until ($response -eq "q")

            

 

Por hoje, era isso.

Smiley piscando

Posted in: Powershell