Você está na página 1de 18

Aprender Powershell

Introduo
Ferramentas
Variveis
Vetores
Objetos
o Utilizando os cmdlets
Operadores Comparativos
Operadores Condicionais
o Redirecionando Sada dos cmdlets
Encontrando os cmdlets
Mdulos
Funes
Utilizando o Get-Help
Execuo de Scripts
Conexes Remotas
Referencias

Introduo

Uma breve introduo ao Shell da Microsoft, ensinando os conceitos bsicos de scripting e a
logica necessria para desenvolvermos nossos scripts assim como as ferramentas j
disponveis 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 prprios scripts.
Ferramentas

Para trabalharmos com o Powershell podemos utilizar o Shell diretamente ou o Powershell ISE,
em estaes Windows 7 / Windows 8 o Powershell ISE j vem instalado, em Servidores 2008 /
2012, ele est disponvel como uma Feature, Iremos trabalhar com a Powershell ISE 3,
presente nas verses 8 / 2012, tambm disponvel para Windows 7 e 2008 R2 no Download
Center.

Caso no queria utilizar a ISE do powershell 3, ignore as partes referentes a nova ISE.

O console Powershell ISE se divide em 3 painis
Script Pane, onde voc edita seus scripts.
Console, exibe a sada do seus comandos e onde podemos executar comandos
diretamente.
Commands, Exibe uma lista dos comandos disponveis e seus parmetros.



A primeira vez que voc abrir seu console ele no ter esse layout, para deixar ele dessa forma
utilize as opes Show Script Pane Top e Show Command Add-on.

Os principais botes da interface seguem um padro utilizado em diversas ferramentas de
desenvolvimento, porm como IT PRO talvez nunca tenhamos utilizado nenhuma, ento temos
a relao dos botes 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 execuo 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 ento realmente utilizar a ISE agora, no Script Pane digite: Write-host "Ol
Mundo!!!"
Aperte o boto Run Script (ou F5) veja que o resultado aparece no console, clique no boto
Clear Console Pane.
Adicione mais uma linha na Script Pane: Write-host "Minha segunda linha!", Selecione a
segunda linha que adicionou e aperte o boto 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 parmetros que o
comando pode receber, preencha o parmetro ComputerName com o seguinte endereo ip:
8.8.8.8 , clique em Run e o comando executado diretamente no Console, clique em Insert e o
comando adicionado ao Console.



Variveis
No Powershell assim como em qualquer outra linguagem utilizamos variveis para armazenar
textos, nmeros e objetos.
O que difere no Powershell que no precisamos descriminar o tipo de varivel como em
outras linguagem por exemplo C#, tudo que precisamos para criar uma varivel jogar um
valor para ela e utilizamos o carcter $ para identificar uma varivel.

Por exemplo se eu quiser criar uma varivel 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 varivel podemos tambm 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 varivel 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 posio 0 desse vetor est presente o nome Matheus na
posio 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 += ,"Ado"
Objetos
Powershell possui inmeros tipos de objetos podendo tambm utilizar objetos C#, mas o que
so objetos? de forma simples os objetos so entidades que possuem propriedades
e mtodos.

A forma mais simples de visualizar os objetos e entender eles verificando a sada 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 so;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 varivel podemos verificar que esse retorno um
vetor comum e podemos selecionar um ndice dele.

$Process = Get-Process
$Process[0]

Podemos listar todas propriedades e mtodos de um objeto utilizando o comando Get-
Member

Get-Process | Get-Member

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

$Process = Get-Process
$Process[0].Name

Dependendo do mtodo do objeto pode ser necessrio passar parmetros para ele ou no,
por exemplo o mtodo Kill do objeto retornado pelo Get-Process no necessita de
nenhum parmetro, j o mtodo WaitForExit recebe como parametro um int. (Abaixo
resultado do Get-Member)


Utilizando os cmdlets
A execuo de cmdlets no possui nenhum mistrio e exatamente igual a execuo de
comandos normais do CMD, passamos o nome do cmdlets ou alias e em seguida
os parmetros.

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 nmeros ou strings.
-eq, Igual a, utilizado para comparar nmeros e textos.
-lt, Menor que, Utilizado para comparar nmeros.
-gt, Maior que, utilizado para comparar nmeros.
-ge, Maior ou igual a, utilizado para comparar nmeros.
-le, Menor que, utilizado para comparar nmeros.
-ne, No igual a, utilizado para comparar nmeros e textos.
-contains, Contm, utilizado para comparar vetores.
-like, Igual, utilizado para comparar textos ou nmeros.
-notlike, No igual a.
-is, , utilizado para comparar tipos de objetos.
-isnot, no , utilizado para comparar tipos de objetos.

Se voc j programa em qualquer linguagem que seja j est familiarizado com esses termos a
unica diferena que powershell ao invs de utilizar os convencionais >,<,=,>= utiliza
expresses mais textuais como -like ou -notlike, Se voc nunca programou calma, que iremos
explicar agora a utilizao dessas coisas.

Os operadores comparativos sozinhos no tem muita utilidade eles geralmente so 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 so utilizados em verificaes de True e False, utilizando os
operadores comparativos, so mais comuns e conhecidos de qualquer linguagem.
if, verifica se a condio for verdadeira.
else, utilizado aps o if, verifica se a condio no foi verdadeira.
elseif,utilizado aps um if ou outro elseif, verifica se a condio anterior no for
verdadeira e uma nova condio for.
while, utilizado para repetir um bloco enquanto uma condio 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 verificaes 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 condio testa seja verdadeira eles executam o bloco
de cdigo indicado, agora digite o seguinte cdigo no Script Pane,

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

Execute ele e ver que o codigo dentro do bloco indicado pelas chaves,no foi executado pois
a condio 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 aps 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 bsico esse, ele
s vai entrar em uma das opes da cadeia.
Abaixo temos mais alguns exemplos que vocs 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 no contem nove e menor que 10
} Else {
Write-Host Maior que 10 e nao contem nove
}


O while muito utilizado quando queremos repetir uma ao enquanto uma situao for
verdadeira, por exemplo queremos escrever um texto na tela enquanto a varivel $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 ao por exemplo
queremos executar uma ao 20 vezes.

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

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


J o foreach, tem uma utilizao diferente da do For, ele tralha com listas, como no exemplo
abaixo.

ForEach($pessoa in matheus,voc,howtoserver){
Write-Host $pessoa legal
}

Poderamos ler esse foreach como "Para cada item na lista "Matheus,Voc,Howtoserver",
execute isso.


Voc pode encontrar mais exerccios aqui
Redirecionando Sada dos cmdlets
Acredito que pessoal familiarizado com Linux j deve saber sobre o que isso se trata, porm
para os novatos em powershell isso pode ser novidade, quando executamos um cmdlet ele nos
retorna um objeto ou um vetor de objetos, ns podemos jogar esse vetor de objetos
diretamente para outro comando ao invs de armazena-la em uma varivel e executar o
comando passando a varivel como parmetro.

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 sada de um cmdlet para
outro os dois devem trabalhar com mesmo tipo de objeto.

Quanto utilizamos a pipeline para redirecionar a sada 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", Podamos ainda encadear mais comandos um aps o outro como por
exemplo.

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

Outro comando muito utilizado aps a pipeline o ForEach-Object, que serve caso nos
queiramos executar uma ao para cada um dos objetos passados na pipeline, por exemplo.

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


Agora somente precisamos utilizar nossa criatividade para elaborarmos filtros e cadeias de
comandos.
Encontrando os cmdlets
O mais importante no decorarmos todos cmdlets e sua sintaxe e sim entendermos como
powershell funciona e como podemos achar o que queremos, para sempre podermos tirar
o mximo de proveito da ferramenta independente do modulo ou cmdlet utilizado
a essncia 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 informao 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 padro Ao "-
" Ferramenta + Objeto, como por exemplo nos cmdlets do IIS, so Get-WebSite ou Get-
WebApplication.

Podemos utilizar o comando Get-Command que nos retorna uma lista de todos os
comandos disponveis e de qual modulo eles vem, por exemplo queremos encontrar algum
comando para acharmos algumas informaes do disco, ento executamos o comando

Get-Command "Get-*Drive*"

Pois queremos Pegar informaes sobre o drive, isso nos retorna 4 possveis comandos, pelo
nome deles deduzimos que seja o Get-PSDrive.

Mdulos
Assim que comearmos a realmente utilizar o powershell para configurar e automatizar nossas
tarefas, vamos nos deparar com os mdulos, vamos agora entender um pouco mais sobre eles.

Os mdulos so conjuntos de cmdlets que podem ser adicionados a sesso powershell,
diversas ferramentas possuem seus prprios mdulos que disponibilizam
cmdlets especficos para suas configuraes. Eles podem ser desenvolvidos por qualquer um.

Voc pode descobrir os mdulos disponveis no seu sistema executando o comando.

Get-Module -ListAvailable

Isso lhe trs uma lista de mdulos disponveis e os comandos que ele possui, se voc quiser
importar um modulo para sua sesso execute.

Import-Module "NomeDoModulo"
Funes

Vamos ento a uma parte fundamental da arte de criar script as funes, elas servem para
simplificar seu cdigo e poupar linhas evitando repeties
Podemos desenvolver nossas prprias funes e utiliz-las em scripts ou em nosso console
diretamente, abordaremos aqui a criao de funes simples, para ler mais sobre o assunto
recomendo o artigo nas referencias.
Criando nossa primeira funo, digamos que em um script seu voc precisa comparar dois
vetores e repete essa comparao 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 diferena 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 $_ }
Ento teramos que repetir sempre o mesmo comando enquanto quisermos fazer verificaes,
ou poderiamos criar uma funo.
Function Compara-Vetor ($VetorA,$VetorB){
$VetorA | Where-Object {$VetorB -contains $_}
}
Agora poderamos somente chamar nossa funo passando os parmetros $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
Porm isso no nos trouxe muitas melhoras na quantidade de linhas mas digamos que alm de
vermos o que a em comum nos vetores queremos poder ver a diferena de um para o outro
nosso script sem funes 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 $_ }
Ento teramos que alterar nossa funo para executar essa ao tambm.
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 no ter sido os melhores exemplos de utilizao de funes mas espero que
vocs 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
informaes sobre o comando, como exemplos de utilizao e quais parmetros ele espera
receber e at mesmo busca online por ajuda, no powershell 3 por default somente o
help bsico 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 mdulos se disponvel podemos executar.

Get-Module -ListAvaliable | Update-Help

Para conseguir o Help dos mdulos 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 bsico sobre o comando Get-Process, podemos
incrementar o get-help com alguns parmetros 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 fcil de descobrimos como utilizar aquele comando que queramos.
Execuo de Scripts

A execuo de scripts no powershell feita utilizando arquivos com extenso .ps1, voc pode
invocar um script chamando ele da seguinte forma.

.\Script.ps1

Porm para executarmos scripts a execuo 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 execuo
acesse http://technet.microsoft.com/library/hh847748.aspx

Com a permisso para executarmos scripts, podemos comear fazendo nosso primeiro script,
salve o codigo abaixo com a exteno .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 opo 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"
Conexes 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 informaes
Windows Powershell
Introduo do Windows Powershell
Manual Windows Powershell
Lista de Cmdlets
Powershell TIPs
Funes