No Powershell podemos criar hashtables, que permitem nomes literais nas chaves. Basicamente declaramos assim:
$usuario = @{nome = "Fulano"; idade = 25; sexo = 'M'}
foreach($u in $usuario.GetEnumerator()) {
"$($u.Name): $($u.Value)"
}
Podemos declarar assim também:
$usuario = @{}
$usuario["nome"] = "Fulano"
$usuario["idade"] = 25
$usuario["sexo"] = 'M'
foreach($u in $usuario.GetEnumerator()) {
"$($u.Name): $($u.Value)"
}
Basicamente, um procedimento (que não retorna nada, fazemos assim):
function exemplo() {
"Teste de Função"
}
# Invocando o procedimento:
exemplo
Em rotinas sem parâmetros, os parênteses são opcionais, mas eles não são usados na invocação da rotina.
Veja um procedimento com parâmetro:
function saudacao($nome) {
"Olá, $nome, tudo bem contigo?"
}
saudacao "teste"
Note que também não usamos parênteses. Isso dá a entender também que todo comando no Powershell é uma rotina.
As funções com retorno também são simples de entender:
function soma($n1, $n2) {
return $n1 + $n2
}
soma 10 5
As funções e procedimentos são usadas em casos que é necessário o reuso de mesmo código.
PS: Caso as funções estejam em outro arquivo, chame da seguinte forma: . "$PSScriptRoot\classes.ps1"
.
Muitas vezes, os programas estão suscetíveis a erros, veja um exemplo:
$num = [int](Read-Host "Digite um número")
"O número digitado é $num"
O programa acima pede um número e converte para inteiro. Caso seja digitado outro tipo de caractere, como uma letra, ele retornará um erro. Para evitar isso usamos o bloco try catch:
try {
$num = [int](Read-Host "Digite um número")
"O número digitado é $num"
}
catch [Exception] {
"Não foi inserido um número!"
}
Dessa forma, podemos colocar uma mensagem personalizada para um erro.
Podemos também subir nossas próprias exceções, por exemplo:
try {
$num = [int](Read-Host "Digite um número")
if($num % 2 -eq 1) {
throw "Só se deve digitar números pares!"
}
"O número digitado é $num"
}
catch [Exception] {
$_.Exception.Message
}
No caso acima, onde ele encontrar o "throw", ele interromperá a execução e passará pro catch.
No entanto, é recomendado colocarmos o throw em funções e procedimentos, por exemplo:
function divisao($n1, $n2) {
if($n2 -eq 0) {
throw "É impossível dividir por zero!"
}
return $n1 / $n2
}
try {
divisao 50 0
}
catch [Exception] {
$_.Exception.Message
}
finally {
"Fim do Programa!"
}
Como visto acima, colocamos o finally, que é executado independente de ter erro ou não.
PS: Existem outras exceções, e podem ser colocadas juntas no mesmo try.
O Windows PowerShell possui inúmeros comandos que podem ser utilizados para efetuar diagnóstico e configuração dos adaptadores de rede do computador, assim como verificar status de conexões e testar a conectividade. Veremos neste tutorial algumas comandos de rede no PowerShell que são equivalentes aos comandos utilizados no prompt (CMD). Vamos lá.
# Visualizar as configurações de rede atuais dos adaptadores:
Get-NetIPConfiguration
# ----------------------------------------------------------------
# Listar os adaptadores e seus respectivos endereços IP:
Get-NetIPAddress | Sort-Object InterfaceIndex | Format-Table InterfaceIndex, InterfaceAlias, IPAddress -AutoSize
# ----------------------------------------------------------------
# Obter informações apenas de interfaces configuradas com IPv4:
Get-NetIPAddress | ? AddressFamily -eq IPv4 | Format-Table –AutoSize
# ----------------------------------------------------------------
# Listar os adaptadores de rede presentes no computador, com seus nomes, descrição, status, endereços MAC e taxa de transmissão:
Get-NetAdapter
# ----------------------------------------------------------------
# Obter informações sobre um adaptador em particular (por exemplo, Ethernet):
Get-NetAdapter Ethernet
# ----------------------------------------------------------------
# Testar conexão a um host (ping):
Test-NetConnection www.google.com.br
# ----------------------------------------------------------------
# Testar conexão a um host com informações mais detalhadas:
Test-NetConnection www.google.com.br -InformationLevel Detailed
# ----------------------------------------------------------------
# Testar conexão a um host e mostrar somente o IP do host, resultado do teste e RTT da conexão:
Test-NetConnection www.google.com.br | Select-Object -ExpandProperty PingReplyDetails | Format-Table Address, Status, RoundTripTime
# ----------------------------------------------------------------
# Descobrir informações sobre os servidores DNS associados a um host (similar a NSLOOKUP):
Resolve-DNSName www.google.com.br
# ----------------------------------------------------------------
# Traçar a rota até um determinado host remoto (tracert):
Test-NetConnection www.google.com.br -TraceRoute
# ----------------------------------------------------------------
# Visualizar as conexões de rede TCP/IP atuais da máquina (similar ao netstat):
Get-NetTCPConnection
# ----------------------------------------------------------------
# Visualizar somente as conexões de rede TCP/IP estabelecidas (status ESTABLISHED):
Get-NetTCPConnection | ? State -eq Established | Format-Table –AutoSize
# ----------------------------------------------------------------
# Visualizar somente as conexões de rede TCP/IP cuja porta remota é a de número 80:
Get-NetTCPConnection | ? RemotePort -eq 80 | Format-Table –AutoSize
# ----------------------------------------------------------------
# Visualizar somente as conexões de rede cujo endereço IP remoto seja diferente de 0.0.0.0:
Get-NetTCPConnection | ? RemoteAddress -NotLike 0.0.0.0 | Format-Table –AutoSize
Primeiramente, devemos executar o Powershell como administrador. Para listar os programas, como já sabemos, digitamos Get-WmiObject -Class Win32_Product | Sort-Object -p ws
. Dessa forma eles são ordenados por nome.
Para filtrar apenas o programa a ser desinstalado, use Get-WmiObject -Class Win32_Product -Filter "Name = 'Nome do Programa'"
.
Sabendo isso, salve o objeto em uma variável, e depois chame o método Uninstall, assim:
$programa = Get-WmiObject -Class Win32_Product -Filter "Name = 'Nome do Programa'"
$programa.Uninstall()
Se o valor de retorno for 0, significa que a exclusão foi concluída com êxito.
Podemos fazer pelo número de identificação do programa também:
$programa = Get-WmiObject -Class Win32_Product -Filter "IdentifyingNumber = '{66F43DBE-6D46-4BCE-831D-0D4C13639BE8}'"
$programa.Uninstall()
PS: Essas opções são um pouco lentas, tenha paciência.