Aprenda Powershell

  • Página Inicial
  • Contato!
  • Tudo sobre Powershell Parte 1!
  • Tudo sobre Powershell Parte 2!
  • Tudo sobre Powershell Parte 3!
  • Tudo sobre Powershell Parte 4!
  • Tudo sobre Powershell Parte 4

    Hashtable

    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)"
    }
    
    

    Rotinas

    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".

    Tratamento de Erros com Try-Catch

    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.

    Comandos de Redes

    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
    
    

    Como Desinstalar Programas pelo Powershell

    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.