Voltando ao Básico: Lógica Condicional com a Instrução If do PowerShell

Este artigo foi atualizado para 2023!

Os scripts podem tomar decisões. Como? Usando um conceito chamado lógica condicional. A instrução if do PowerShell e os construtos if/else são as formas comuns de definir condições.

Ao escrever scripts do PowerShell, você o faz com uma tarefa ou objetivo específico em mente. No entanto, uma operação pode ter múltiplas ações possíveis com base em uma ou mais condições. Esta situação é onde o construto If do PowerShell entra em cena.

Neste artigo, você aprenderá o construto If-Else do PowerShell e entenderá sua sintaxe e como ele funciona. Você também aprenderá algumas maneiras de usar a instrução If do PowerShell para adicionar tratamento de lógica condicional em seus scripts a partir dos exemplos.

Entendendo a Sintaxe da Instrução If do PowerShell

O construto if-else do PowerShell avalia uma ou mais expressões condicionais. Abaixo, você verá a sintaxe da instrução If. Este estilo é frequentemente chamado de controle de fluxo.

if (<test1>)
    {<statement list 1>}
[elseif (<test2>)
    {<statement list 2>}]
[else
    {<statement list 3>}]

Como você pode ver na sintaxe acima, cada teste é envolvido por parênteses (). Os testes podem fazer uso de diferentes operadores, como operadores de comparação e operadores lógicos,

As listas de instruções contêm o código destinado a ser executado se o resultado do teste for avaliado como verdadeiro.

Então, há três declarações possíveis em um grupo de instruções If. Estas são as declarações IF, ELSEIF e ELSE.

  • A instrução if contém o primeiro teste a ser avaliado, seguido pela primeira lista de instruções envolvidas em chaves {}. A instrução PowerShell if é a única instrução necessária para estar presente.
  • A declaração elseif é onde você adiciona condições. Você pode adicionar múltiplas declarações ElseIf quando tiver múltiplas condições. O PowerShell avaliará cada uma dessas condições sequencialmente.
  • A declaração else não aceita nenhuma condição. A lista de instruções nesta declaração contém o código a ser executado se todas as condições anteriores testadas forem falsas.

Entendendo o Fluxo Lógico da Instrução If do PowerShell

Para entender melhor como o If-Else do PowerShell funciona, familiarize-se com seu fluxo lógico. O diagrama abaixo ilustra o fluxo básico do If-Else do PowerShell.

PowerShell If Statement Logic Flow

Quando a instrução if é executada, o PowerShell passa por cada condição avaliando se o código retorna verdadeiro ou falso. Um resumo do comportamento está abaixo:

  • O PowerShell avalia a condição em Teste 1.
  • Se o resultado do Teste 1 retornar verdadeiro, o código dentro da lista da instrução If será executado, então o PowerShell sai da instrução If.
  • Se o resultado do Teste 1 retornar falso, o PowerShell continua a avaliar a condição (Teste n) na próxima declaração ElseIf.
  • Se o resultado de Test n retornar false, o PowerShell continuará a avaliar a condição (Test n) na próxima instrução ElseIf, se outra instrução ElseIf existir -OU-
  • Se o resultado do Test n retornar false, o código na instrução Else será executado, e o PowerShell sairá da instrução If -OU-
  • Se o resultado do Test n retornar verdadeiro, o código na instrução ElseIf será executado, e o PowerShell sairá da instrução If.

Usando a Instrução If-Else do PowerShell

As próximas seções são vários exemplos de como a instrução If do PowerShell é usada ao escrever scripts. As técnicas que você aprenderá podem orientá-lo no uso da instrução If caso você encontre uma situação da vida real que exija seu uso.

Condição If-Else Única

Começando com o mais básico, temos a única instrução If do PowerShell. Você deve usar uma única instrução if quando houver apenas uma condição para testar.

O exemplo abaixo testa se o valor da variável $num é maior que 10. Se o resultado for verdadeiro, o resultado dizendo "$num é maior que 10" será exibido na tela. Se o resultado for falso, o PowerShell não faz nada porque há apenas uma condição para testar.

$num = 11
if ($num -gt 10) {
    "$num is greater than 10"
}

Se você verificar apenas um valor específico, como if ($Valor) { }, então o PowerShell testará se o $Valor não é $Nulo, 0, $False, uma string vazia ou um array vazio.

Colando o código acima no PowerShell, você obterá o resultado mostrado abaixo.

Single If Condition Example

Agora, você pode adicionar a instrução Else se quiser adicionar uma ação padrão de “fallback” em vez de apenas deixar o PowerShell não fazer nada quando o resultado do teste for falso.

No exemplo abaixo, o código na instrução Else será executado se o valor da variável $num NÃO for maior que 10.

$num = 9
if ($num -gt 10)
{
    "$num is greater than 10"
}
else
{
    "$num is NOT greater than 10"
}

A execução do código modificado no PowerShell produz a saída mostrada abaixo.

Single If statement condition

Começando com o PowerShell 7.0, uma nova sintaxe para a instrução If foi introduzida usando um operador ternário. As instruções If únicas podem fazer bom uso dessa nova sintaxe.

Usando o mesmo exemplo acima, assim é como o código ficaria com o operador ternário.

$num = 11
$num -gt 10 ? "$num is greater than 10" : "$num is NOT greater than 10"
If statement syntax using ternary operator

Testando o $Null em uma Instrução If do PowerShell

Você pode pensar que testar uma condição de $Null é direto. Mas, o lado em que você coloca o valor $Null é importante, pois pode não resultar no mesmo em cada condição. É uma prática recomendada sempre colocar a condição $Null à esquerda, assim.

$Null -NE $Value

Se você colocar o teste de $Null no lado direito e o valor do lado esquerdo for uma lista, como um array, então $Null agirá como um filtro. Como pode ser visto no exemplo abaixo, se $Null for colocado no lado esquerdo, você terá resultados booleanos consistentes.

$List = @(1,2,2,3,4)
$List -NE $Null
$List -EQ $Null
$Null -NE $Null
$Null -EQ $Null
$Null testing conditions for PowerShell If Statement

Condições Múltiplas If-Else com ElseIf

Ao avaliar múltiplas condições, é necessário adicionar uma ou mais instruções ElseIf. Cada instrução ElseIf contém a expressão de teste e o código a ser executado.

O script abaixo, quando executado, continuará solicitando um nome de fruta até que a tecla CTRL+C seja pressionada, ou o usuário insira a letra “X“.

Então, a instrução If passará por cada condição em sequência até encontrar uma correspondência. Se a entrada não corresponder a nenhuma das condições, o código dentro da instrução Else será executado.

While ($fruit -ne "X") {
    $fruit = Read-Host "Name that fruit"

    if ($fruit -eq 'Apple') {
        'I have an Apple'
    }
    elseif ($fruit -eq 'Banana') {
        'I have a Banana'
    }
    elseif ($fruit -eq 'Orange') {
        'I have an Orange'
    }
    else {
        'Sorry, that fruit is not in the list'
    }
}

Aqui está uma demonstração de como o script acima se comporta ao ser executado no PowerShell.

Multiple If-Else conditions

Relatando o Status do Espaço Livre em Disco

O relatório do espaço livre em disco é uma tarefa comum para administradores de sistema. A maneira usual de relatar as informações de espaço dos discos fixos em uma máquina Windows gira em torno do código abaixo.

Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}

As informações que o código acima retornará se parecerão com as mostradas na próxima captura de tela.

Plain disk space information report

Como você pode ver, a saída acima mostra a letra da unidade, os valores de espaço livre e outras propriedades. Embora a saída acima esteja bem, ela não é intuitiva. Como as informações são apresentadas não indica se o espaço em disco está em estado crítico, de aviso ou normal.

Usando uma Instrução If do PowerShell para Melhorar o Código

A more intuitive output can be achieved using the PowerShell If-Else statement by adding conditions to check if the free space is over or below certain thresholds. And these thresholds will define the status of the free disk space.

O script de exemplo abaixo realiza o seguinte:

  • Usando o valor da variável $Critical, define o limite no qual a porcentagem de espaço livre será marcada como crítica.
  • Usando o valor da variável $Aviso, defina o limiar para o qual a porcentagem de espaço livre será marcada como aviso.
  • Obtenha todas as informações do disco fixo da máquina local
  • Itere por todas as informações do disco para determinar o espaço livre e marcar seu status.
    • Se a porcentagem de espaço livre for maior que o valor da variável $Aviso, o status do espaço em disco é marcado como normal.
    • Se a porcentagem de espaço livre for maior que o valor da variável $Crítico, o status do espaço em disco é marcado como aviso.
    • Se a porcentagem de espaço livre for menor ou igual ao valor da variável $Crítico, o status do espaço em disco é marcado como crítico.
  • Componha as propriedades do objeto 'Letra da unidade', 'Nome da unidade', 'Espaço total (GB)', 'Espaço livre (GB)', 'Espaço livre (%)' e 'Status'.
  • Retorne o relatório final.

Copie o código abaixo e salve o script com o nome de arquivo Get-DiskSpace.ps1. Não se esqueça de alterar os valores das variáveis $Critical e $Warning para testar com diferentes limiares.

# Definir limiares em porcentagem
$Critical = 20
$Warning = 70

# Obter todas as informações do Disco Fixo
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { $_.DriveType -eq 3 }

# Inicializar uma matriz vazia que conterá os resultados finais
$finalReport = @()

# Iterar cada informação de disco
$diskObj.foreach(
    {
        # Calcular a porcentagem de espaço livre
        $percentFree = [int](($_.FreeSpace / $_.Size) * 100)

        # Determinar o "Status"
        if ($percentFree -gt $Warning) {
            $Status = 'Normal'
        }
        elseif ($percentFree -gt $Critical) {
            $Status = 'Warning'
        }
        elseif ($percentFree -le $Critical) {
            $Status = 'Critical'
        }

        # Compor as propriedades do objeto a ser adicionado ao relatório
        $tempObj = [ordered]@{
            'Drive Letter'     = $_.DeviceID
            'Drive Name'       = $_.VolumeName
            'Total Space (GB)' = [int]($_.Size / 1gb)
            'Free Space (GB)'  = [int]($_.FreeSpace / 1gb)
            'Free Space (%)'   = "{0}{1}" -f [int]$percentFree, '%'
            'Status'           = $Status
        }

        # Adicionar o objeto ao relatório final
        $finalReport += New-Object psobject -property $tempObj
    }
)

return $finalReport

Você também pode atribuir o resultado da condição if/else a uma variável, ou seja, $Status = if ($percentFree -gt $Warning) { 'Normal' } para potencialmente criar uma condição mais curta.

Depois que o script for salvo, teste-o chamando seu nome no PowerShell. Abaixo está uma demonstração de amostra de como esse script funciona.

Free Disk Space Status Command Output

Como você pode ver a partir da saída, o status de cada disco é determinado pela porcentagem de espaço livre no disco, que foi o resultado do uso de várias condições com If-Else do PowerShell.

Múltiplos e If-Else Aninhados

Vamos dizer que você tenha uma declaração if-else com uma condição definida no bloco else. Quando a declaração if-else é executada, o bloco else é invocado se o código dentro do bloco if retornar false.

Dentro do bloco else, você precisa realizar outro teste condicional. Como resultado, você precisa de outra declaração If-Else. Este cenário é chamado de If-Else aninhado. A declaração If-Else aninhada é comumente usada se o If-Else interno depender do resultado da operação no If-Else externo.

Usar múltiplas e aninhadas declarações If-Else pode ser bastante confuso. O ponto-chave é lembrar da colocação da estrutura e garantir que você indente seu código. Indentar seu código ajudará você a reconhecer e separar facilmente suas declarações If-Else.

Exemplo de Declarações If-Else Múltiplas/Aninhadas

O script de exemplo abaixo mostra como múltiplas e aninhadas declarações If-Else podem depender do resultado umas das outras. A lógica do código abaixo é a seguinte.

  • Se o $SendEmail for $false, o script não fará nada e sairá.
  • Se o $SendEmail for $true, então as variáveis $From e $To não devem estar vazias ou nulas. Caso contrário, o $abortFlag será definido como 1.
  • Se o $SendEmail for $true e o $CCEnabled for $true, então a variável $CC não deve estar vazia ou nula. Caso contrário, o $abortFlag será definido como 1.
  • Se o $SendEmail for $true e o $BCCEnabled for $true, então a variável $BCC não deve estar vazia ou nula. Caso contrário, o $abortFlag será definido como 1.
  • Se o valor do $abortFlag for 1, o script sairá neste ponto e não continuará.
  • Se o valor do $abortFlag for 0, o script continuará até o final.

Copie o código abaixo e salve-o como Send-MyMail.ps1. Não altere nenhum valor ainda.

$SendEmail = $true

$From = ""
$To = ""

$CCEnabled = $true
$CC = ""

$BCCEnabled = $true
$BCC = ""

$abortFlag = 0

if ($SendEmail) {
    if (!$From) {
        Write-Host "[From] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if (!$To) {
        Write-Host "[To] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if ($CCEnabled) {
        if (!$CC) {
            Write-Host "[CC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($BCCEnabled) {
        if (!$BCC) {
            Write-Host "[BCC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($abortFlag -eq 1) {
        Write-Host "The abort flag has been tripped. Exit script." -ForegroundColor Red
        break
    }
    else {
        Write-Host "Your email will be sent from this address $From" -ForegroundColor Green
        Write-Host "And will be sent to the following people:" -ForegroundColor Green
        Write-Host "To: $To" -ForegroundColor Green

        if ($CCEnabled -and $CC) {
            Write-Host "CC: $CC" -ForegroundColor Green
        }

        if ($BCCEnabled -and $BCC) {
            Write-Host "BCC: $BCC" -ForegroundColor Green
        }
    }
}

Depois de salvar o arquivo, execute-o no PowerShell, conforme mostrado abaixo. A demonstração abaixo mostra o resultado do script quando os valores das variáveis permanecem inalterados.

Nested If-Else example

Em seguida, edite o script e atualize todas as variáveis corretamente, como no trecho abaixo.

$SendEmail = $true

$From = "[email protected]"
$To = "[email protected]"

$CCEnabled = $true
$CC = "[email protected]"

$BCCEnabled = $true
$BCC = "[email protected]"

---SNIP---

Após editar as variáveis, salve o script e execute-o novamente. Deve mostrar o mesmo resultado, como visto abaixo.

Another nested If-else example

Agora, modifique as variáveis e teste combinações para ver como o If-Else aninhado será afetado. Modificar e testar por conta própria ajudará você a entender melhor a lógica.

Resumo

Neste artigo, você aprendeu sobre a construção lógica condicional – a construção de declaração If do PowerShell. A declaração If-Else permite que os scripters formulem lógica condicional e direcionem as ações de seus scripts com base nos resultados dos testes.

Com os exemplos neste artigo, você deve ter aprendido maneiras e técnicas de usar a declaração If-Else ao criar um código orientado por decisões. If-Else pode ser simples usando uma única condição e fica mais complexo à medida que você se aprofunda nas declarações If-Else aninhadas.

O que você acha do comando If-Else? É algo que você acredita que usaria mais após ler este artigo? Que outros propósitos você considera onde pode aplicar o conhecimento adquirido aqui?

Leitura adicional

Source:
https://adamtheautomator.com/powershell-if-else/