Tudo o que você queria saber sobre a instrução if

  • 05/23/2020
  • 18 minutos para ler
    • j
    • x
    • t
    • D
    • s

Como muitas outras línguas, o PowerShell tem instruções para condicionalmente a execução de código em yourscripts. Uma dessas declarações é a declaração de fi., Hoje vamos dar um mergulho profundo em um dos comandos mais fundamentais em PowerShell.

Nota

a versão original deste artigo apareceu no blog escrito por @KevinMarquette. A equipa de showershell agradece ao Kevin por partilhar este conteúdo connosco. Por favor, confira seu blog atPowerShellExplained.com.

execução condicional

seus scripts muitas vezes precisam tomar decisões e executar uma lógica diferente baseada nessas decisões.É isto que quero dizer com execução condicional., Você tem uma declaração ou valor para avaliar, então execute uma seção diferente de código com base nessa avaliação. Isto é exatamente o que a declaração

faz.

A instrução if

Aqui está um exemplo básico de if declaração:

$condition = $trueif ( $condition ){ Write-Output "The condition was true"}

a primeira coisa que O if instrução faz é avaliar a expressão entre parênteses. If it evaluates to $true, then it executes the scriptblock in the braces., Se o valor fosse $false, então ele iria saltar sobre o scriptblock.

no exemplo anterior, a declaração if estava apenas a avaliar a variável $condition. Era$true e teria executado o comando Write-Output dentro do scriptblock.

em algumas línguas, você pode colocar uma única linha de código após a declaração if e ela é examinada. Não é esse o caso em PowerShell. Você deve fornecer um scriptblock com aparelho para que funcione corretamente.,

operadores de comparação

o uso mais comum do if afirmação para é comparar dois itens um com o outro. A PowerShell tem operadores especiais para diferentes cenários de comparação. Quando você usa um operador de comparação, o valor no lado esquerdo é comparado com o valor no lado direito.

– eq for equality

The faz uma verificação de igualdade entre dois valores para se certificar de que eles são iguais um ao outro.,

$value = Get-MysteryValueif ( 5 -eq $value ){ # do something}

neste exemplo, eu estou tendo um valor conhecido de 5 e comparando-a com o meu $value para ver se theymatch.

um possível caso de uso é verificar o estado de um valor antes de tomar uma ação sobre ele. Poderá configurar um serviço e verificar se o estado estava a correr antes de chamar Restart-Service nele.

é comum em outras línguas como C# usar ==para a igualdade (ex:5 == $value) mas isso não funciona com PowerShell., Outro erro comum que as pessoas cometem é usar o sinal de igual (ex:5 = $value) que é reservado para atribuir valores a variáveis. Ao colocar o seu valor conhecido à esquerda, torna esse erro mais embaraçoso de cometer.este operador (e outros) tem algumas variações.,

  • -eq case-insensitive igualdade
  • -ieq case-insensitive igualdade
  • -ceq sensível a maiúsculas e minúsculas igualdade

-ne não igual a

Muitos operadores têm uma operadora que está verificando o resultado oposto. -ne verifica que os valores não se equivalem.

if ( 5 -ne $value ){ # do something}

Use isto para se certificar de que a acção só é executada se o valor não for 5., Um bom uso-casos em que seria para verificar se um serviço estava no estado de execução antes de você tentar iniciá-lo.

Variações:

  • -ne maiúsculas e minúsculas não são iguais
  • -ine maiúsculas e minúsculas não são iguais
  • -cne sensível a maiúsculas e minúsculas não são iguais

Estas são inversas variações de -eq. Vou agrupar estes tipos quando listar variações para outros operadores.,

– gt-ge-lt-le para maior ou menor do que

estes operadores são utilizados ao verificar se um valor é maior ou menor do que outro valor.The -gt -ge -lt -le stand for GreaterThan, GreaterThanOrEqual, less than, and LessThanOrEqual.,comedor do que ou igual a, sensível a maiúsculas e minúsculas

  • -cge maior que ou igual a, sensível a maiúsculas e minúsculas
  • -lt menor que
  • -ilt a menos que, não diferencia maiúsculas de minúsculas
  • -clt menor que, sensível a maiúsculas e minúsculas
  • -le menor ou igual
  • -ile menor ou igual a, não diferencia maiúsculas de minúsculas
  • -cle menor ou igual a, sensível a maiúsculas e minúsculas
  • eu não sei por que você iria usar sensível a maiúsculas e minúsculas opções para estes operadores.,

    -like wildcard matches

    PowerShell has its own wildcard-based pattern matching syntax and you can use it with the-likeoperator. Estes padrões de caracteres especiais são bastante básicos.

    • ? corresponde a qualquer caractere único
    • * corresponde a qualquer número de caracteres
    $value = 'S-ATX-SQL01'if ( $value -like 'S-*-SQL??'){ # do something}

    É importante ressaltar que o padrão coincide com a seqüência inteira. Se você precisar de encaixar algo no meio da cadeia, você precisa colocar o * em ambas as extremidades da cadeia.,e”>

    Variações:

    • -like case-insensitive curinga
    • -ilike case-insensitive curinga
    • -clike sensível a maiúsculas e minúsculas curinga
    • -notlike case-insensitive curinga não correspondido
    • -inotlike case-insensitive curinga não correspondido
    • -cnotlike sensível a maiúsculas e minúsculas curinga não correspondido

    -corresponde à expressão regular

    -match operador permite que você verifique uma seqüência de caracteres para um expressões regulares baseado no jogo., Use isto quando os padrões de wildcard não são flexíveis o suficiente para você.

    $value = 'S-ATX-SQL01'if ( $value -match 'S-\w\w\w-SQL\d\d'){ # do something}

    um padrão regex corresponde a qualquer ponto da cadeia por padrão. Então você pode especificar um sub-texto que deseja igualado como este:

    $value = 'S-ATX-SQL01'if ( $value -match 'SQL'){ # do something}

    Regex é uma linguagem complexa por si só e que vale a pena procurar. I talk more about -match and many ways to use regex in another article.,

    Variations:

    • -match case-insensitive regex
    • -imatch case-insensitive regex
    • -cmatch case-sensitive regex
    • -notmatch case-insensitive regex not matched
    • -inotmatch case-insensitive regex not matched
    • -cnotmatch case-sensitive regex not matched

    -is of type

    You can check a value’s type with the -is operator.,

    if ( $value -is ){ # do something}

    pode usar isto se estiver a trabalhar com classes ou a aceitar vários objectos sobre o gasoduto. Você pode ter um serviço ou um nome de serviço como sua entrada. Em seguida, verifique para ver se você tem um serviço e obter o serviço se você só tem o nome.,

    if ( $Service -isnot ){ $Service = Get-Service -Name $Service}

    Variações:

    • -is tipo
    • -isnot não é do tipo

    Coleção de operadores

    Quando você usa os operadores anteriores com um único valor, o resultado é $true ou $false. Esta situação é ligeiramente diferente quando se trabalha com uma colecção. Cada item da colecção é avaliado e o operador devolve todos os valores que avaliam para $true.,

    PS> 1,2,3,4 -eq 33

    This still works correctly in a if statement. Assim, um valor é devolvido pelo seu operador, então a declaração whole é $true.

    $array = 1..6if ( $array -gt 3 ){ # do something}

    há uma pequena armadilha escondida nos detalhes aqui que eu preciso apontar. Ao usar o operador -nedesta forma, é fácil olhar erroneamente para a lógica ao contrário. Usando -ne com a recolha devolve $true se algum item da colecção não corresponder ao seu valor.,

    PS> 1,2,3 -ne 4123

    Este pode parecer um truque inteligente, mas temos os operadores -contains e -in que lidar com esse moreefficiently. E -notcontains faz o que você espera.

    – contém

    o -contains o operador verifica a colecção quanto ao seu valor. Assim que ele encontra um jogo, ele volta $true.

    $array = 1..6if ( $array -contains 3 ){ # do something}

    esta é a forma preferida de ver se uma colecção contém o seu valor., Usando Where-Object (ou) percorre toda a lista de cada vez e é significativamente mais lento.,

    Variações:

    • -contains maiúsculas e minúsculas correspondem
    • -icontains maiúsculas e minúsculas correspondem
    • -ccontains sensível a maiúsculas e minúsculas correspondem
    • -notcontains case-insensitive não correspondido
    • -inotcontains case-insensitive não correspondido
    • -cnotcontains sensível a maiúsculas e minúsculas não correspondido

    no

    -in operador é como o -contains operador, exceto a coleção é sobre o direito handside.,

    $array = 1..6if ( 3 -in $array ){ # do something}

    Variations:

    • -in case-insensitive match
    • -iin case-insensitive match
    • -cin case-sensitive match
    • -notin case-insensitive not matched
    • -inotin case-insensitive not matched
    • -cnotin case-sensitive not matched

    Logical operators

    Logical operators are used to invert or combine other expressions.,

    -não

    -not operador vira uma expressão de $false $true ou de $true $false. Aqui está um exemplo onde queremos realizar uma ação quando Test-Path é $false.

    if ( -not ( Test-Path -Path $path ) )

    a maioria dos operadores de que falámos têm uma variação em que não é necessário utilizar o operador-notoperador. Mas ainda há momentos em que é útil.

    !, operador

    pode utilizar!como nome alternativo para-not.

    if ( -not $value ){}if ( !$value ){}

    você pode ver! usado mais por pessoas que vêm de outras línguas como C#. Eu prefiro digitar itout porque eu acho que é difícil de ver quando olhando rapidamente para os meus scripts.

    – e

    pode combinar expressões com o operador -and. Quando você faz isso, ambos os lados precisam ser$true para que toda a expressão seja $true.,

    if ( ($age -gt 13) -and ($age -lt 55) )

    neste exemplo, $age deve ter 13 anos ou mais para o lado esquerdo e inferior a 55 para o lado direito. Entre parênteses adicionais para torná-lo mais claro nesse exemplo, mas eles são opcionais, desde que a expressão seja simples. Aqui está o mesmo exemplo sem eles.

    if ( $age -gt 13 -and $age -lt 55 )

    a avaliação acontece da esquerda para a direita. Se o primeiro item avaliar para $false, ele sai cedo e não executa a comparação certa. Isto é útil quando você precisa ter certeza de que um valor existe antes de usá-lo., Por exemplo, Test-Path lança um erro se lhe der um $null path.

    if ( $null -ne $path -and (Test-Path -Path $path) )

    ou

    -or permite que você especifique duas expressões e retorna $true se qualquer um deles for$true.

    if ( $age -le 13 -or $age -ge 55 )

    assim como com o operador -and, a avaliação acontece da esquerda para a direita., Exceto que se a primeira parte é $true, então a declaração inteira é $true e não processa o resto da expressão.

    também tome nota de como a sintaxe funciona para estes operadores. Precisas de duas expressões separadas. Eu vi Usuários tentar fazer algo assim $value -eq 5 -or 6 sem perceber o seu erro.

    -XOR exclusivo ou

    Este é um pouco incomum. -xor permite apenas uma expressão para avaliar a $true., Assim, se ambos os itens são $false ou ambos os itens são $true, então a expressão inteira é $false. Outra maneira de encarar isso é a expressão é apenas $true quando os resultados da expressão são diferentes.

    é raro que alguém alguma vez usaria este operador lógico e eu não consigo pensar em um bom exemplo como towhy eu iria usá-lo.

    operadores Bitwise

    operadores Bitwise realizam cálculos sobre os bits dentro dos valores e produzem um novo valor como resultado., Ensinar operadores bitwise está além do escopo deste artigo, mas aqui está a lista deles.

    • -band binário E
    • -bor binário OU
    • -bxor binário exclusivo OU
    • -bnot binário NÃO
    • -shl shift para a esquerda
    • -shr shift direito

    PowerShell expressões

    podemos normal de utilização do PowerShell dentro da declaração de condição.,

    if ( Test-Path -Path $Path )

    Test-Path retorna $true ou $false quando ele é executado. Isto também se aplica a comandos que retornam outros valores.

    if ( Get-Process Notepad* )

    Ele avalia $true se existe um devolvidos processo e $false se não’sn’thing., Ele’sperfectly válido para usar o pipeline de expressões ou outros PowerShell afirmações como esta:

    if ( Get-Process | Where Name -eq Notepad )

    Estas expressões podem ser combinados uns com os outros, com o -and e -or operadores, mas você mayhave usar parênteses para quebrá-los em subexpressões.

    if ( (Get-Process) -and (Get-Service) )

    Verificação para $null

    apesar nenhum resultado ou uma $null valor de avalia $false if instrução., Ao verificar especificamente para $null, é uma boa prática colocar o $null no lado esquerdo.

    if ( $null -eq $value )

    Há algumas nuances ao lidar com $null valores no PowerShell. Se estás interessado em mergulhar mais fundo, tenho um artigo sobre tudo o que querias saber sobre o $null.

    atribuição de variáveis

    quase me esqueci de adicionar este até Prasoon Karunan V me lembrar dele.,

    if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}

    normalmente, quando se atribui um valor a uma variável, o valor não é passado para o pipeline orconsole. Quando você faz uma atribuição variável em uma sub-expressão, ela é passada para a linha.

    PS> $first = 1PS> ($second = 2)2

    Veja como o $first atribuição não tem saída e o $second atribuição não? When an assignmentis done in an if statement, it executes just like the $second assignment above., Aqui é um cleanexample sobre como você poderia utilizar:

    if ( $process = Get-Process Notepad* ){ $process | Stop-Process}

    Se $process é atribuído um valor, em seguida, a instrução é $true e $process fica parado.

    certifique-se que não confunde isto com porque isto não é uma verificação da igualdade. Esta é uma característica de maior visibilidade que a maioria das pessoas não percebem que funciona assim.,

    Alternativo caminho de execução

    if instrução permite que você especificar uma ação para não só quando a instrução é $true, butalso quando $false. É aqui que a declaração

    entra em jogo.

    else

    The else statement is always the last part of the if statement when used.

    neste exemplo, nós verificamos o $path para ter certeza de que é um arquivo. Se encontrarmos o ficheiro, mudamo-lo. Se não, escrevemos um aviso., Este tipo de lógica ramificada é muito comum.

    if Aninhado

    if e else declarações de levar um bloco de script, de modo que podemos colocar qualquer comando do PowerShell insidethem, incluindo outra if instrução. Isso permite que você faça uso de uma lógica muito mais complicada.

    neste exemplo, nós testamos o caminho feliz primeiro e, em seguida, tomar medidas sobre ele. Se isso falhar, fazemos outra verificação e fornecemos informações mais detalhadas ao usuário.

    elseif

    não estamos limitados a apenas um único controlo condicional., We can chain if and else statementstgether instead of nesting them by using the statement.

    a execução acontece de cima para baixo. A declaração top if é avaliada primeiro. If thatis $false, then it moves down to the next or else in the list. Esse último else é a ação por omissão a tomar se nenhum dos outros retornar $true.,

    switch

    At this point, I need to mention the switch statement. Ele fornece uma sintaxe alternativa para comparações múltiplas com um valor. Com o switch, você especifica uma expressão e esse resultado fica comparado com vários valores diferentes. Se um desses valores coincidir, o bloco de código correspondente é executado. Veja este exemplo:

    $itemType = 'Role'switch ( $itemType ){ 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' }}

    Existem três valores possíveis que podem corresponder ao$itemType. Neste caso, corresponde com Role., Iused a simple example just to give you some exposure to the switch operator. Eu falo mais sobre tudo o que você sempre quis saber sobre a declaração de troca em outro artigo.

    Pipeline

    o pipeline é uma característica única e importante do PowerShell. Qualquer valor que não seja supressed ou atribuído a uma variável é colocado no pipeline. O if proporciona-nos uma forma de tirar partido do gasoduto de uma forma que nem sempre é óbvia.,

    $discount = if ( $age -ge 55 ){ Get-SeniorDiscount}elseif ( $age -le 13 ){ Get-ChildDiscount}else{ 0.00}

    cada bloco de script está colocando os resultados os comandos ou o valor no pipeline. Em seguida, Atribuímos o resultado do id

    afirmação à variável$discount. Esse exemplo poderia ter assim como easilyassigned esses valores para o$discountvariável diretamente em cada scriptblock. Eu não posso dizer que uso isso com a declaraçãoiffrequentemente, mas eu tenho um exemplo onde eu usei isso recentemente.,

    Array inline

    i have a function called Invoke-SnowSql that launches an executable with several command-linearguns. Aqui está um clipe dessa função onde eu construo o array de argumentos.

    The $Debug and $Path variables are parameters on the function that are provided by the end user.Avalio-os em linha dentro da inicialização da minha matriz. Se $Debug for verdadeiro, então esses valores caem no $snowSqlParam no lugar correto. O mesmo vale para a variável $Path.,

    Simplifique as operações complexas

    é inevitável que se depare com uma situação que tem demasiadas comparações para verificar e o seuIf a declaração desloca-se do lado direito do ecrã.

    eles podem ser difíceis de ler e que fazem você mais propenso a cometer erros. Há algumas coisas que podemos fazer quanto a isso.

    continuação da linha

    Existem alguns operadores em PowerShell que lhe permitem mudar o comando para a linha seguinte., Os logicaloperadores -and e -or são bons operadores a usar se quiser quebrar a sua expressão em linhas intomultiplicadas.

    ainda há muita coisa acontecendo lá, mas colocar cada peça em sua própria linha faz uma grande diferença.Eu geralmente uso isso quando eu recebo mais de duas comparações ou se eu tenho que rolar para a direita ler alguma da lógica.

    pré-cálculo dos resultados

    podemos tirar essa Declaração da declaração if e apenas verificar o resultado.

    isto apenas se sente muito mais limpo do que o exemplo anterior., Também lhe é dada a oportunidade de usar um nome variável que explica o que está realmente a verificar. Este é também um exemplo de código de auto-documentação que poupa comentários desnecessários.

    múltiplas declarações if

    podemos dividir isto em várias declarações e verificá-las uma de cada vez. Neste caso, usamos aflag ou uma variável de rastreamento para combinar os resultados.

    eu tive que inverter a lógica para fazer a lógica da bandeira funcionar corretamente. Cada avaliação é individualizada if declaração., A vantagem disso é que quando você está debugging, você pode tellexactamente o que a lógica está fazendo. Pude adicionar uma verbosidade muito melhor ao mesmo tempo.

    a desvantagem óbvia é que é muito mais código para escrever. O código é mais complexo de olhar para atas que pega uma única linha de lógica e explode-o em 25 ou mais linhas.

    usando funções

    também podemos mover toda a lógica de validação para uma função. Olha como isto parece limpo.,

    if ( Test-SecureDriveConfiguration -ADUser $user ){ # do something}

    você ainda tem que criar a função para fazer a validação, mas isso torna este código muito mais fácil de trabalhar com. Torna este código mais fácil de testar. Em seus testes, você pode zombar da chamada paraTest-ADDriveConfiguration e você só precisa de dois testes para esta função. Um em que devolve$true e outro em que devolve $false. Testar a outra função é mais simples porque é pequena.

    O corpo dessa função ainda pode ser aquele Invólucro único com o qual começamos ou a lógica explodida que usamos na última seção., Isto funciona bem para ambos os cenários e permite-lhe alterar facilmente a sua aplicação mais tarde.

    tratamento de erros

    uma utilização importante doif é verificar as condições de erro antes de executar erros. Um bom exemplo é verificar se uma pasta já existe antes de tentar criá-la.

    if ( -not (Test-Path -Path $folder) ){ New-Item -Type Directory -Path $folder}

    i like to say that if you expect an exception to happen, then it’s not really an exception. Por isso, verifique os seus valores e valide as suas condições onde puder.,

    Se você quiser mergulhar um pouco mais no tratamento de exceção real, eu tenho um artigo sobre tudo o que você sempre quis saber sobre exceções.

    Palavras Finais

    aif a afirmação é uma afirmação tão simples, mas é uma peça fundamental de PowerShell. Você vai encontrar-se usando isso várias vezes em quase todos os scripts que você escreve. Espero que tenhas uma compreensão melhor do que tinhas antes.

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *