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"
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"
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
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"
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.
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>
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.
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"}
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.
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"
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.
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
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}
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
Obrigado, continue postando materiais assim, me ajudou muito.
Parabéns
Vocês acham valido dividir esse artigo em artigos menores e deixar esse com o link deles?
Muito bom o material, continue assim!
Sensacional !
O artigo é simplesmente fantástico, material de alta qualidade
Valeu Matheus
Ótima introdução! Desmistificou muita coisa.
Parabéns!