Compartilhar via


Aprender Powershell

Introdução

Uma breve introdução ao Shell da Microsoft, ensinando os conceitos básicos de scripting e a logica necessária para desenvolvermos nossos scripts assim como as ferramentas já disponíveis nativamente.

Esse artigo se aplica principalmente a IT PROs que estejam tentando aprender a utilizar essa ferramente que vem ganhando cada vez mais recursos e pode ser utilizada para automatizar praticamente qualquer processo.

Ao final do artigo acredito que você terá conseguido expandir seus horizontes e esteja apto a iniciar seus próprios scripts.

Ferramentas

Para trabalharmos com o Powershell podemos utilizar o Shell diretamente ou o Powershell ISE, em estações Windows 7 / Windows 8 o Powershell ISE já vem instalado, em Servidores 2008 / 2012, ele está disponível como uma Feature, Iremos trabalhar com a  Powershell ISE 3, presente nas versões 8 / 2012, também disponível para Windows 7 e 2008 R2 no Download Center.

Caso não queria utilizar a ISE do powershell 3, ignore as partes referentes a nova ISE.

O console Powershell ISE se divide em 3 painéis

  • Script Pane, onde você edita seus scripts.
  • Console, exibe a saída do seus comandos e onde podemos executar comandos diretamente.
  • Commands, Exibe uma lista dos comandos disponíveis e seus parâmetros.

A primeira vez que você abrir seu console ele não terá esse layout, para deixar ele dessa forma utilize as opções Show Script Pane Top e Show Command Add-on.

Os principais botões da interface seguem um padrão utilizado em diversas ferramentas de desenvolvimento, porém como IT PRO talvez nunca tenhamos utilizado nenhuma, então temos a relação dos botões e teclas de atalho.

  • Clear Console Pane , Limpa o painel de console. 
  • Run Script (F5)  , Executa o script que estiver na Script Pane.
  • Run Selection (F8) , Executa o texto que estiver selecionado na Script Pane.
  • Stop (CTRL + Break) , Para a execução do Script.
  • New Remote Powershell Tab , Inicia uma nova guia que será executada em um servidor remoto.
  • Start Powershell.exe  , Inicia o Powershell.exe.

Agora vamos então realmente utilizar a ISE agora, no Script Pane digite: Write-host "Olá Mundo!!!"
Aperte o botão Run Script (ou F5) veja que o resultado aparece no console, clique no botão Clear Console Pane.
Adicione mais uma linha na Script Pane: Write-host "Minha segunda linha!", Selecione a segunda linha que adicionou e aperte o botão Run Selection (F8).
Vamos procurar agora por algum outro comando para executarmos, no painel Commands comece a digitar lentamente Test-Connection, perceba que enquanto você digita ele procura o comando para você, selecione o comando na lista, verifique os parâmetros que o comando pode receber, preencha o parâmetro ComputerName com o seguinte endereço ip: 8.8.8.8 , clique em Run e o comando é executado diretamente no Console, clique em Insert e o comando é adicionado ao Console.

View

Variáveis 

No Powershell assim como em qualquer outra linguagem utilizamos variáveis para armazenar textos, números e objetos.
O que difere no Powershell é que não precisamos descriminar o tipo de variável como em outras linguagem por exemplo C#, tudo que precisamos para criar uma variável é jogar um valor para ela e utilizamos o carácter $ para identificar uma variável.

Por exemplo se eu quiser criar uma variável contendo meu nome somente digito no painel de console.

$Nome = "Matheus"

Se quiser uma com minha idade.

$Idade = 19

Simples, se quiser especificar o tipo de variável podemos também como por exemplo

[String]$Nome = "Matheus"

Vetores

O que seria um vetor? um vetor na verdade é um Array que contem itens no Powershell para utilizarmos vetores podemos de forma simples somente passa-los para uma variável separados por ",".

$Nomes = "Matheus","Henrique","Eduardo"
$Nomes

Se quisermos podemos adicionar objetos , inteiros ou qualquer tipo de item ao vetor da mesma forma que mostrado acima.

O vetor possui um índice, ou seja na posição 0 desse vetor está presente o nome Matheus na posição 1 o nome Henrique, podemos exibir somente o índice desejado do vetor.

$Nomes = "Matheus","Henrique","Eduardo"
$Nomes[2]  

 Para aumentar o tamanho de um vetor existente é igualmente simples.

$Nomes += ,"Adão"

Objetos

Powershell possui inúmeros tipos de objetos podendo também utilizar objetos C#, mas o que são objetos? de forma simples os objetos são entidades que possuem propriedades e métodos.

A forma mais simples de visualizar os objetos e entender eles é verificando a saída de um comando Powershell, execute no painel do Console o seguinte comando.

Get-Process

Ele nos retorna um vetor de objetos do tipo System.Diagnostics.Process, cada um com diversas propriedades mas as exibidas por default são;Handles, NPM, PM, WS, VM, CPU, ID, ProcessName

Em cima dessas propriedades podemos aplicar os operadores comparativos e condicionais.
Se salvarmos o retorno do comando em uma variável podemos verificar que esse retorno é um vetor comum e podemos selecionar um índice dele.

$Process = Get-Process
$Process[0]

Podemos listar todas propriedades e métodos de um objeto utilizando o comando Get-Member

Get-Process | Get-Member

Que nos retorna a lista das propriedades e métodos desse objeto, se quisermos acessar uma propriedade ou um método do objeto pode fazer isso dessa maneira.

$Process = Get-Process
**$Process[0].Name
**
Dependendo do método do objeto pode ser necessário passar parâmetros para ele ou não, por exemplo o método Kill do objeto retornado pelo Get-Process não necessita de nenhum parâmetro, já o método WaitForExit recebe como parametro um int. (Abaixo resultado do Get-Member)

Utilizando os cmdlets

A execução de cmdlets não possui nenhum mistério e exatamente igual a execução de comandos normais do CMD, passamos o nome do cmdlets ou alias e em seguida os parâmetros.

Get-Process -Name "Notepad"

Operadores Comparativos

Servem como o nome já diz para comparar duas coisas, utilizaremos eles em quase todos scripts que formos desenvolver, por exemplo comparar dois números ou strings. 

  • -eq, Igual a, utilizado para comparar números e textos.
  • -lt, Menor que, Utilizado para comparar números.
  • -gt, Maior que, utilizado para comparar números.
  • -ge, Maior ou igual a, utilizado para comparar números.
  • -le, Menor que, utilizado para comparar números.
  • -ne, Não igual a, utilizado para comparar números e textos.
  • -contains, Contém, utilizado para comparar vetores.
  • -like, Igual, utilizado para comparar textos ou números.
  • -notlike, Não igual a.
  • -is, é, utilizado para comparar tipos de objetos.
  • -isnot, não é, utilizado para comparar tipos de objetos
    .

Se você já programa em qualquer linguagem que seja já está familiarizado com esses termos a unica diferença é que powershell ao invés de utilizar os convencionais “>”,”<”,”=”,”>=” utiliza expressões mais textuais como -like ou -notlike, Se você nunca programou calma, que iremos explicar agora a utilização dessas coisas.

Os operadores comparativos sozinhos não tem muita utilidade eles geralmente são utilizados com os operadores condicionais, mas o que eles fazem é obvio, comparam valores e nos retornam um verdadeiro ou falso, abaixo temos alguns exemplos que você pode executar no painel de Console do Powershell ISE.

9 -gt 7 <enter>
9 -lt 20 <enter>
9 -eq 9 <enter>
9 -ne 9 <enter>
1,2,3,4,5,6,7 -contains 1 <enter>
“Powershell” -like “Power” <enter>
“Powershell” -like “Power*” <enter>
“Power” -notlike “Powera” <enter>
“lalala” -is [String] <enter>
“lala” -isnot [Sring] <enter>

Operadores Condicionais

Agora já temos uma boa ideia de como os operadores comparativos funcionam, veremos os operadores condicionais, que são utilizados em verificações de True e False, utilizando os operadores comparativos, são mais comuns e conhecidos de qualquer linguagem.

  • if, verifica se a condição for verdadeira.
  • else, utilizado após o if, verifica se a condição não foi verdadeira.
  • elseif,utilizado após um if ou outro elseif, verifica se a condição anterior não for verdadeira e uma nova condição for.
  • while, utilizado para repetir um bloco enquanto uma condição for verdadeira.
  • for, utilizado para repetir um bloco um predeterminado numero de vezes.
  • foreach, utilizado para repetir um bloco uma vez para cada item em uma lista.
  • where, utilizado para filtrar itens em uma lista.
  • switch, utilizado para executar multiplas verificações substituindo uma cadeia de ifs.** **

Agora se você é um dos IT PROs que nunca trabalhou com nenhuma linguagem deve estar se perguntando como utilizar isso, pois bem abaixo temos alguns exemplos para serem executados no painel Script Pane.

No Script Pane digite,

If(10 -gt 9){
Write-Host "é maior"
}

Rode o script, e veja que ele escreveu no console "é maior", os operadores condicionais trabalham dessa forma, caso a condição testa seja verdadeira eles executam o bloco de código indicado, agora digite o seguinte código no Script Pane,

If(9 -gt 10){
Write-Host "é maior"
}

Execute ele e verá que o codigo dentro do bloco indicado pelas chaves,não foi executado pois a condição retornou False, você pode utilizar junto do if qualquer um dos operadores comparativos.

Continuando com os exemplos, podemos ainda utilizar o else e o elseif após o if, execute os dois codigos abaixo.

If( 9 -gt 10){
Write-Host "foi true!"
} Else {
Write-Host "foi false"
}

If(10 -lt 9){
Write-Host "é menor que 9"
} ElseIf(10 -lt 11) {
Write-Host "é menor que 11 e maior que 9"
} Else {
Write-Host "é maior que 9 e 11"
}

Podemos ter uma cadeia mais complexa de ifs,elses e elseifs mas o conceito básico é esse, ele só vai entrar em uma das opções da cadeia.
Abaixo temos mais alguns exemplos que vocês podem executar no Script Pane.

$a = 9
If(1,2,3,4,5,6 -contains $a){
Write-Host “contem nove”
} ElseIf ( $a -lt 10) {
Write-Host “não contem nove e é menor que 10″
} Else {
Write-Host “Maior que 10 e nao contem nove”
}

O while é muito utilizado quando queremos repetir uma ação enquanto uma situação for verdadeira, por exemplo queremos escrever um texto na tela enquanto a variável $a for menor que 100.

$a = 30
While($a -lt 100){
Write-Host “variavel a ainda é menor que 100… $a”
$a+=1
}

O for é utilizado quando sabemos quantas vazes queremos executar alguma ação por exemplo queremos executar uma ação 20 vezes.

For($i = 0 ;$i -lt 20;$i++){
Write-Host “$i subindo….”
**} **

Podemos considerar a estrutura do for dessa maneira, "Para variável $i igual a 0, enquanto a variável $i for menor que 20, aumente a variável $i de um em um"

Já o foreach, tem uma utilização diferente da do For, ele tralha com listas, como no exemplo abaixo.

ForEach($pessoa in “matheus”,”você”,”howtoserver”){
**Write-Host “$pessoa é legal”
}
**
Poderíamos ler esse foreach como "Para cada item na lista "Matheus,Você,Howtoserver", execute isso.

Você pode encontrar mais exercícios aqui

Redirecionando Saída dos cmdlets

Acredito que pessoal familiarizado com Linux já deve saber sobre o que isso se trata, porém para os novatos em powershell isso pode ser novidade, quando executamos um cmdlet ele nos retorna um objeto ou um vetor de objetos, nós podemos jogar esse vetor de objetos diretamente para outro comando ao invés de armazena-la em uma variável e executar o comando passando a variável como parâmetro.

Por exemplo, queremos matar o processo do Notepad que esteja rodando em nosso computador, podemos executar

Get-Process -Name "Notepad" | Stop-Process

Isso automaticamente joga todos objetos retornamos do comando Get-Process para o comando Stop-Process, Você deve saber que para redirecionar a saída de um cmdlet para outro os dois devem trabalhar com mesmo tipo de objeto.

Quanto utilizamos a pipeline para redirecionar a saída de um comando para outro, ele passa um objeto por vez, sendo o objeto passa pela pipeline referenciado como $_ do outro lado, sendo assim se você quiser aplicar um filtro utilizando o Where-Object, você pode fazer dessa maneira.

Get-Process | Where-Object { $_.Name -like "Notepad" }

Utilizamos a pipeline para jogar o resultado do cmdlet Get-Process para o cmdlet Where-Object e fizemos com que ele nos retornasse somente os objetos que tem a propriedade Name igual a "Notepad", Podíamos ainda encadear mais comandos um após o outro como por exemplo.

Get-Process | Where-Object { $_.Name -like "Notepad" } | Stop-Process

Outro comando muito utilizado após a pipeline é o ForEach-Object, que serve caso nos queiramos executar uma ação para cada um dos objetos passados na pipeline, por exemplo.

Get-Process | Where-Object { $_.Name -like "N*"} | ForEach-Object {Write-Host $_.Name" começa com N"}

Agora somente precisamos utilizar nossa criatividade para elaborarmos filtros e cadeias de comandos.

Encontrando os cmdlets

O mais importante não é decorarmos todos cmdlets e sua sintaxe e sim entendermos como powershell funciona e como podemos achar o que queremos, para sempre podermos tirar o máximo de proveito da ferramenta independente do modulo ou cmdlet utilizado a essência sempre será a mesma.

Se você já executou algum cmdlets qualquer, percebeu a nomenclatura dele por exemplo Get-* ou Set-*, todos cmdlets seguem essa logica se eu quero pegar alguma informação já sei que devo procurar um comando que comece com Get, se quero alterar alguma coisa procuro por Set, se quero criar algo novo procuro por New ou Add, se quero remover Remove.

Agora outra coisa que facilita é que geralmente temos o seguinte padrão Ação "-" **Ferramenta **+ Objeto, como por exemplo nos cmdlets do IIS, são Get-WebSite ou Get-WebApplication.

Podemos utilizar o comando Get-Command que nos retorna uma lista de todos os comandos disponíveis e de qual modulo eles vem, por exemplo queremos encontrar algum comando para acharmos algumas informações do disco, então executamos o comando

Get-Command "Get-*Drive*"

Pois queremos Pegar informações sobre o drive, isso nos retorna 4 possíveis comandos, pelo nome deles deduzimos que seja o Get-PSDrive.

Módulos

Assim que começarmos a realmente utilizar o powershell para configurar e automatizar nossas tarefas, vamos nos deparar com os módulos, vamos agora entender um pouco mais sobre eles.

Os módulos são conjuntos de cmdlets que podem ser adicionados a sessão powershell, diversas ferramentas possuem seus próprios módulos que disponibilizam cmdlets específicos para suas configurações. Eles podem ser desenvolvidos por qualquer um.

Você pode descobrir os módulos disponíveis no seu sistema executando o comando.

Get-Module -ListAvailable  

Isso lhe trás uma lista de módulos disponíveis e os comandos que ele possui, se você quiser importar um modulo para sua sessão execute.

Import-Module "NomeDoModulo"

Funções

Vamos então a uma parte fundamental da arte de criar script as funções, elas servem para simplificar seu código e poupar linhas evitando repetições

Podemos desenvolver nossas próprias funções e utilizá-las em scripts ou em nosso console diretamente, abordaremos aqui a criação de funções simples, para ler mais sobre o assunto recomendo o artigo nas referencias.

Criando nossa primeira função, digamos que em um script seu você precisa comparar dois vetores e repete essa comparação com diversos vetores.

*$A = 1,2,3,4,5
*$B = 5,6,7,8,9
$A | Where-Object {$B -contains $_ }

E nos repetimos esse comando diversas vezes para sabermos a diferença entre um vetor e outro.

*$A = 1,2,3,4,5
*$B = 5,6,7,8,9
$C = 9,10,11,12,13
$D = 13,14,15,16,17
$A | Where-Object {$B -contains $_ }
$A | Where-Object {$C -contains $_ }
$A | Where-Object {$D -contains $_ }
$D | Where-Object {$B -contains $_ }
$C | Where-Object {$D -contains $_ }

Então teríamos que repetir sempre o mesmo comando enquanto quisermos fazer verificações, ou poderiamos criar uma função.

*Function Compara-Vetor ($VetorA,$VetorB){
$VetorA | **Where-Object *{$VetorB -contains $_}
}

Agora poderíamos somente chamar nossa função passando os parâmetros $VetorA e $VetorB e nosso script ficaria assim.

*Function Compara-Vetor ($VetorA,$VetorB){
$VetorA | *Where-Object  {**$VetorB -contains $_}
}
$A = 1,2,3,4,5
$B = 5,6,7,8,9
$C = 9,10,11,12,13
$D = 13,14,15,16,17
Compara-Vetor -VetorA $A -VetorB $B
Compara-Vetor -VetorA $C -VetorB $D

Porém isso não nos trouxe muitas melhoras na quantidade de linhas mas digamos que além de vermos o que a em comum nos vetores queremos poder ver a diferença de um para o outro nosso script sem funções ficaria

$A = 1,2,3,4,5
$B = 5,6,7,8,9
$C = 9,10,11,12,13
$D = 13,14,15,16,17
$A | Where-Object {$B -contains $_ }
$A | Where-Object {$C -contains $_ }
$A | Where-Object {$D -contains $_ }
$D | Where-Object {$B -contains $_ }
$C | Where-Object {$D -contains $_ }
$A | Where-Object {$B -notcontains $_ }
$A | Where-Object {$C -notcontains $_ }
$A | Where-Object {$D -notcontains $_ }
$D | Where-Object {$B -notcontains $_ }
$C | Where-Object {$D -notcontains $_ }

Então teríamos que alterar nossa função para executar essa ação também.

Function Compara-Vetor($VetorA,$VetorB,[switch]$Diferenca){
if($Diferenca){
$VetorA | Where-Object {$VetorB -notcontains $_}
} else {
$VetorA | Where-Object {$VetorB -contains $_}
}
}
Compara-Vetor -VetorA $A -VetorB $B -Diferenca
Compara-Vetor -VetorA $A -VetorB $B

Esses podem não ter sido os melhores exemplos de utilização de funções mas espero que vocês tenham entendido.

Utilizando o Get-Help

Agora você já sabe utilizar e como achar os comandos, mas as vezes precisamos de algo mais, esse algo mais é o Get-Help, similar ao man dos nossos amigos pinguins, ele nos traz informações sobre o comando, como exemplos de utilização e quais parâmetros ele espera receber e até mesmo busca online por ajuda, no powershell 3 por default somente o help básico está incluso você pode utilizar o comando Update-Help para baixar o help dos cmdlets, o update help baixa os helps por modulos para baixar o help para todos os módulos se disponível podemos executar.

Get-Module -ListAvaliable | Update-Help

Para conseguir o Help dos módulos core do powershell, você deve executar como administrator o powershell ou a ISE e executar.

**Update-Help  Microsoft.PowerShell.Management,Microsoft.PowerShell.Utility **

A sintaxe do Get-Help é simples.

Get-Help Get-Process

No caso acima ele nos traz o informativo básico sobre o comando Get-Process, podemos incrementar o get-help com alguns parâmetros como os abaixo.

Get-Help Get-Process -Examples
Get-Help Get-Process -Full
Get-Help Get-Process -Parameter
Get-Help Get-Process -Functionality

Get-Help Get-Process -Online

Entre outros, assim fica fácil de descobrimos como utilizar aquele comando que queríamos.

Execução de Scripts

A execução de scripts no powershell é feita utilizando arquivos com extensão .ps1, você pode invocar um script chamando ele da seguinte forma.

.\Script.ps1

Porém para executarmos scripts a execução de scripts precissa estar habilitada, podemos habilita-la executando o comando Set-ExecutionPolicy e informando qual politica de script queremos ativar.

Set-ExecutionPolicy 1

Para ler mais sobre as regras de execução acesse http://technet.microsoft.com/library/hh847748.aspx

Com a permissão para executarmos scripts, podemos começar fazendo nosso primeiro script, salve o codigo abaixo com a extenção .**ps1 **.

Get-Process "Notepad" | Foreach-Object {write-host "ID:"$_.ID,"Nome"$_.Name,"CPU"$_.CPU}

Agora vamos até a pasta onde script está salvo e chamamos ele, podemos tambem fazer com que nossos scripts recebam parametros adicionamdo ao inicio dele a opção param.

** param ([string]$ProcessName)**
**Get-Process "$ProcessName" | Foreach-Object {write-host "ID:"$_.ID,"Nome"$_.Name,"CPU"$_.CPU}
**
Salve o arquivo novamente e execute ele dessa forma .\Script.ps1 -ProcessName "Notepad"

Conexões Remotas

.

Referencias

Esse artigo foi baseado basicamente no conhecimento adquirido com o trabalho dia a dia utilizando powershell, muito do material qui colocado pode ser encontrado no meu blog HowToServer.
Abaixo deixo links para sites que podem ser consultados como fonte dessas informações

Este artigo foi originalmente escrito por:
**Matheus Kamphorst | **blog: http://howtoserver.com

https://c.statcounter.com/8402792/0/5d6dfbe3/1/