O Powershell também tem caracteres de escape, só que diferente de outras linguagens, ele não usa a barra invertida, já que esta é usada para separar nomes de pastas. Ele utiliza crases (`).
Veja um exemplo de uso:
Write-Host "Instituto de Scripts`0" # Fim de linha
Write-Host "Alerta: `a" # Aviso sonoro
Write-Host "Uma frase de exemplo`n" # Pula de linha
Basicamente são os mesmos usados nas outras linguagens, apenas substituindo o \ pelo `, como `n, `", `t, etc.
Podemos utilizar parâmetros no Write-Host, por exemplo:
Write-Host "Fulano"
Write-Host -Object (Get-Date)
Veja outros usos para esse comando:
Write-Host "Fulano" -f Red -b Black # Isso muda a cor
Write-Host "Fulano" "Beltrano" -Separator "_"
Write-Host @("Fulano", "Beltrano") -Separator "`n"
Os operadores lógicos como &&, || e ! não funcionam no Powershell, por estes serem característicos do C e semelhantes. No Powershell usamos -and
, -or
e -not
.
Veja um exemplo abaixo:
(3 -eq 3) -and (3 -eq 3)
(3 -eq 3) -and (3 -eq 3) -and (4 -gt 5)
(3 -eq 3) -or (3 -eq 3) -or (4 -gt 5)
-not (3 -eq 3)
-not (4 -gt 5)
Como sabemos, no and tudo tem que ser verdadeiro pra retornar true, no or só necessita que apenas uma das expressões sejam verdadeiras para retornar true, e o not inverte a condição.
A estrutura do if e else no Powershell é bem parecida com a das linguagens C-like, por exemplo:
if(1 -lt 5) {
"1 é menor que 5"
}
# Outra condição
if(5 -lt 8) {
"5 é menor que 8"
}
Ou seja, se no if a condição for verdadeira, ela será executada, senão ela não executará, ou poderá executar o que está no else, por exemplo:
if(1 -lt 5) {
"1 é menor que 5"
}
else {
"1 não é menor que 5"
}
# Outra condição
if(5 -lt 8) {
"5 é menor que 8"
}
else {
"5 não é menor que 8"
}
Agora baixe esse arquivo de texto para executarmos um teste: Clique Aqui
E no Powershell digite o comando Select-String -Path .\arq.txt -Pattern "gosto de bolo"
, veja que ele retorna a linha e o conteúdo do arquivo. Então no script ps1 fazemos assim:
if(Get-ChildItem .\arq.txt | Select-String "gosto de bolo") {
"Ele gosta de bolo sim!"
}
else {
"Ele não gosta de bolo!"
}
Podemos por exemplo, usar ifs aninhados também:
$u = Read-Host "Usuário"
$s = Read-Host "Senha"
if($u -eq "Admin") {
if($s -eq "123") {
"Login Aceito!"
}
else {
"Senha Incorreta!"
}
}
else {
"Login Inválido!"
}
E o elseif:
$num = [int](Read-Host "Digite um número")
if($num % 2 -eq 0) {
"$num é par!"
}
elseif($num % 2 -eq 1) {
"$num é ímpar!"
}
else {
"Valor inválido!"
}
Já o Switch, funciona dessa forma:
$cor = "branco"
switch($cor) {
"azul" {
"Você escolheu azul!"
break
}
"preto" {
"Você escolheu preto!"
break
}
"rosa" {
"Você escolheu rosa!"
break
}
"amarelo" {
"Você escolheu amarelo!"
break
}
"verde" {
"Você escolheu verde!"
break
}
"branco" {
"Você escolheu branco!"
break
}
default {
"Você escolheu outra cor!"
break
}
}
PS: Caso tenha mais de uma opção pro mesmo caso, faça assim:
{$_ -in "vermelho", "vinho"} {
"Você escolheu tons de vermelho!"
break
}
Outro exemplo:
$dia = (Get-Date).DayOfWeek.value__
switch($dia) {
0 {
"Hoje é Domingo!"
break
}
1 {
"Hoje é Segunda-Feira!"
break
}
2 {
"Hoje é Terça-Feira!"
break
}
3 {
"Hoje é Quarta-Feira!"
break
}
4 {
"Hoje é Quinta-Feira!"
break
}
5 {
"Hoje é Sexta-Feira!"
break
}
6 {
"Hoje é Sábado!"
break
}
default {
"Dia Inválido!"
break
}
}
PS: O break não é obrigatório no Powershell, mas ele é usado para evitar que seja escolhido mais de uma condição dentro do switch.
A estrutura de repetição while também existe no powershell, veja um exemplo de uso:
$n = 1
while($n -le 10) {
Write-Host $n
$n++
}
Também podemos usar o break e o continue nos laços:
$n = 0
while($true) {
$n++
if($n -eq 11) {
continue
}
elseif($n -eq 15) {
break
}
Write-Host $n
}
Temos também o do while, que garante pelo menos uma execução, independente da condição:
$n = 0
do {
Write-Host $n
$n++
}
while($n -le 10)
E temos o for, onde controlamos melhor a quantidade de repetições:
for($i = 0; $i -lt 10; $i++) {
"Volta $i"
}
Também podemos definir vetores no Powershell:
$numeros = 12, 88, 59, 43, 92, 75, 33
for($i = 0; $i -lt $numeros.Length; $i++) {
$numeros[$i] + "`n"
}
Também podemos usar um foreach pra isso:
$numeros = 12, 88, 59, 43, 92, 75, 33
foreach($n in $numeros) {
"$n"
}
Como podemos inicializar com um contador, por exemplo:
$numeros = 1..10
foreach($n in $numeros) {
"$n"
}
Com strings, já fazemos assim:
$nomes = @("Fulano", "Beltrano", "Sicrano")
foreach($n in $nomes) {
"$n"
}
Mas essa forma pode ser usada para números também:
$numeros = @(12, 88, 59, 43, 92, 75, 33)
O Powershell permite misturar tipos dentro dos arrays.
Veja um exemplo de matriz, com vários tipos de dados:
$pessoas = @(("Fulano", 30, 1.6),
("Beltrano", 17, 1.7),
("Sicrano", 26, 1.71))
for($l = 0; $l -lt 3; $l++) {
for($c = 0; $c -lt 3; $c++) {
Write-Host -NoNewline $pessoas[$l][$c] " "
}
""
}
Mas podemos forçar uma tipagem de dados também:
[string]$letras = @('A', 'B', 'C')
$letras += 'D'
E também podemos usar o objeto ArrayList, assim:
Using Assembly System.Collections
$lista = [System.Collections.ArrayList]::new()
$lista.AddRange(('A', 'B', 'C')) # Adiciona vários itens
$lista.Add('D') # Adiciona um item
$lista.Contains('A') # Verifica se um item existe
$lista.Capacity # Capacidade de Dados
$lista.Count # Tamanho de dados
"`n"
foreach($l in $lista) {
$l
}
# Isso força conversão de array comum pra arraylist:
$novaLista = [System.Collections.ArrayList]@('A', 'E', 'I', 'O', 'U')
Para ordenar arrays, podemos fazer assim:
$numeros = @(7, 4, 6, 2, 1, 9, 3, 5, 0, 8)
$numeros | Sort-Object