- 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úsculaseu 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-like
operator. 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 -ne
desta 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-not
operador. 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$discount
variável diretamente em cada scriptblock. Eu não posso dizer que uso isso com a declaraçãoif
frequentemente, 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.