De Volta às Origens: Lógica Condicional com a Declaração If do PowerShell

Este artigo foi atualizado para 2023!

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 específica em mente. Mas, uma operação pode ter múltiplas ações possíveis baseadas em uma ou mais condições. Esta situação é onde entra o construto If do PowerShell.

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 está entre 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 avaliar como verdadeiro.

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

  • A declaração if contém o primeiro teste a ser avaliado, seguido pela primeira lista de declarações entre chaves {}. A declaração PowerShell if é a única declaraçã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 várias condições. O PowerShell irá avaliar cada uma dessas condições sequencialmente.
  • A declaração else não aceita nenhuma condição. A lista de declarações nesta declaração contém o código a ser executado se todas as condições anteriores testadas forem falsas.

Compreendendo o Fluxo Lógico da Declaraçã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 declaraçã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 de Teste 1 retornar verdadeiro, o código dentro da lista da declaração If será executado, então o PowerShell sai da declaração If.
  • Se o resultado de Teste 1 retornar falso, o PowerShell continua a avaliar a condição (Teste n) na próxima declaração ElseIf.
  • Se o resultado do Teste 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 Teste 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 Teste n retornar true, 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 apresentam 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 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, $Falso, uma string vazia ou um array vazio.

Colar o código acima no PowerShell fornecerá 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 permitir que o PowerShell não faça 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"
}

Executar o código modificado no PowerShell fornece 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. Instruções If únicas podem fazer bom uso dessa nova sintaxe.

Usando o mesmo exemplo acima, é assim que 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 para $Null em uma Instrução If do PowerShell

Você pode pensar que testar uma condição de $Null é simples. Mas, o lado em que você coloca o valor $Null é importante, pois pode não resultar na mesma coisa em todas as condições. É uma boa prática sempre colocar a condição $Null no lado esquerdo, assim.

$Null -NE $Value

Se você colocar o teste $Null no lado direito, e o valor do lado esquerdo for uma lista, como um array, então o $Null atuará como um filtro. Como você pode ver pelo exemplo abaixo, se o $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

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

Ao avaliar múltiplas condições, você precisa adicionar uma ou mais declarações ElseIf. Cada declaraçã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 declaraçã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'
    }
}

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

Multiple If-Else conditions

Relatório do Status do Espaço Livre em Disco

Relatar o espaço livre em disco é uma tarefa comum para administradores de sistemas. 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 correta, ela não é intuitiva. Como as informações são apresentadas não indica se o espaço em disco está em um 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, defina o limiar para o qual a porcentagem de espaço livre será marcada como crítica.
  • Usando o valor da variável $Warning, defina o limiar para o qual a porcentagem de espaço livre será marcada como warning.
  • Obtenha todas as informações de disco fixo da máquina local
  • Itere por todas as informações de 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 $Warning, 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 $Critical, o status do espaço em disco é marcado como warning.
    • Se a porcentagem de espaço livre for menor ou igual ao valor da variável $Critical, o status do espaço em disco é marcado como crítico.
  • Componha as propriedades do objeto 'Drive Letter', 'Drive Name', 'Total Space (GB)', 'Free Space (GB)', 'Free Space (%)' e 'Status'.
  • Devolver 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 limites.

# Definir limites em percentagem
$Critical = 20
$Warning = 70

# Obter todas as informações de 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 percentagem 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, por exemplo, $Status = if ($percentFree -gt $Warning) { 'Normal' } para potencialmente criar uma condição mais curta.

Depois que o script estiver salvo, teste-o chamando seu nome no PowerShell. Abaixo está uma demonstração de amostra de como este 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 de usar várias condições com o If-Else do PowerShell.

Vários e If-Else Aninhados

Vamos supor 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 falso.

Dentro do bloco else, você precisa realizar outro teste condicional. Como resultado, você precisa de outra declaração If-Else. Esse 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.

O uso de declarações If-Else múltiplas e aninhadas pode ser bastante confuso. O ponto chave é lembrar da posição do esqueleto 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 If-Else múltiplas e aninhadas 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 podem 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 pode estar vazia ou nula. Caso contrário, o $abortFlag será definido como 1.
  • Se o $SendEmail é $true e o $BCCEnabled é $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 de $abortFlag for 1, o script sairá neste ponto e não continuará.
  • Se o valor de $abortFlag for 0, o script continuará até o fim.

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, como 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 este 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, conforme visto abaixo.

Another nested If-else example

Agora, modifique as variáveis e experimente combinações para testar 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 If Statement do PowerShell. A instrução If-Else permite aos scripters formular lógica condicional e direcionar as ações de seus scripts com base nos resultados dos testes.

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

O que você acha da instrução If-Else? É algo que você acredita que estaria usando mais e mais após ler este artigo? Que outros propósitos você pode considerar onde pode aplicar o conhecimento que adquiriu aqui?

Leitura adicional

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