1
Prezado amigo! O SQL Saturday é um evento gratuito e os nossos patrocinadores são responsáveis por garantir toda a infra-estrutura para que o evento aconteça. Não deixe de conferir as promoções e serviços oferecidos por eles. Para isto, basta aceitar o contato via email em seu profile no site do PASS. Muito obrigado aos patrocinadores por terem feito este evento acontecer!!! 2
Bom, antes de começar, aqui está algumas coisas que tenho feito com powershell: Coletar informações sobre a configuração de software e hardware de vários servidores Automatizar a leitura e geração de relatórios de arquivos de log Executar vários scripts em diversos servidores ao mesmo tempo Automatizar a cópia de bancos de dados Extrair páginas de dados corrompidas do SQL Server do arquivo Integrar o SQL Server com o Zabbix Gerenciar um cluster Migrar bases de dados e servidores SQL Fazer backups de código (procedures, views, funções) e de arquivos E muito mais! Tudo depende do quanto você conhece de powershell, e, o mais importante, de sua criatividade. 3
O objetivo desta apresentação é te mostrar o mundo powershell e que tipos de coisas você pode fazer com ele. Vamos ver o básico de sua estrutura e entender os principais conceitos através de demonstrações simples e práticas. Esta apresentação está organizada nos seguintes momentos: 1. Conceitos de Shell e primeiras interações com powershell 2. Comandos básicos 3. Variáveis, Tipos e Arrays 4. Objetos versus Texto 5. Pipeline Faça bom proveito! 4
Para entender o que é powershell, primeiro é necessário compreender o que é um shell. Um shell é uma interface entre o usuário e o Sistema Operacional. É um software capaz de se comunicar com o sistema operacional para acessar os serviços fornecedos pelo mesmo, como por exemplo: criar e copiar arquivos, executar programas, enviar dados via rede, etc. Um shell é simplesmente um software que recebe comandos de fácil compreensão para o usuário, executa um processamento, se comunicando com o Sistema Operacional, através dos serviços oferecidos pelo mesmo (via API), e devolve uma resposta. O cmd.exe, ou Prompt de Comando era o shell padrão do Windows. Ele fornecia diversos comandos como o dir ou start. O powershell é uma evolução do velho Prompt de Comando e fornece uma gama muito maior de recursos, incluindo elementos de programação.net, semelhantes à linguagem C# (C Sharp). 5
Você pode usar powershell de várias maneiras, porém a mais comum é através da ferramenta powershell.exe. Assim como cmd.exe, powershell.exe vai apresentar um console onde é possível digitar comandos e receber os resultados. Se você programa em.net, você pode facilmente integrar sua aplicações com o powershell usando a classe Powershell, que se encontra no namespace System.Management.Automation. Como o powershell.exe é um programa executável, você pode inicá-lo usando o velho prompt de comando também. Basta digitar powershell.exe na linha de comando. Há um editor em que você pode criar scripts. O editor tem recursos como debug e auto-completar, além de colorir o código, que são de grande ajuda para desenvolver scripts complexos. Este editor é chamado de Windows Powershell ISE. Você pode usar outras ferramentas, como o notepad++ para criar scripts powershell também. A ferramenta powershell.exe aceita diversos parâmetros que você pode usar para incrementar suas soluções, como agendar a execução de scripts. 6
Ao abrir o powershell, você irá observar uma tela onde é exibido um texto com uma espécie de banner. Esse banner exibe apenas o texto Windows Powershell seguido de uma linha com informações de direitos autorais. Após duas linhas, é exibido algo semelhante a PS C:\>. O PS indica que você está no powershell. O C:\ é o diretório que está atualmente.! Os comandos em powershell são bem parecidos com os comandos do prompt de comando. Basta digitá-los e apertar ENTER. Por uma questão de organização e padronização, o powershell dispõe os comandos na forma Verbo-Nome. 7
Por exemplo, para listar os processos que estão em execução, basta utilizar o comando Get-Process. Para visualizar os arquivos de um diretório, use Get- ChildItem. Estes comandos são chamados de cmdlets. Para aqueles que estão familiarizados com o Prompt de Comando ou com o Linux, o powershell também fornece alguns comandos com o mesmo nome nestes outros ambientes: Por exemplo, os comandos dir e ls, que serve para lista os arquivos de um diretório, retornam extamente a mesma informação. Na verdade, estes comandos são atalhos ou apelidos (alias) para os cmdlets que existem. Você também pode facilmente exibir valores na tela, bastando apenas digitá-los. Por exemplo, se digitar 10, o powershell retorna 10. Se digitiar 10 + 1 o powershell retorna 11. Existem diversos operadores matemáticos. Se digitar o texto Isto é um texto, o powershell irá exibir o texto. 8
Nesta demo, vamos apenas observar como variáveis podems ser úteis, para guardar o resultado de cmdlets, por exemplo. Existe um cmdlet chamado Get-Date. Ele retorna a data atual. Se você executar Get-Date três vezes, então três datas diferentes serão retornadas, por conta dos segundos. Get-Date Get-Date Get-Date Porém, se você guardar o valor em uma variável, e exibir estas variáveis três vezes, então o mesmo valor sempre será exibido. $Data = Get-Date $Data $Data $Data 9
Você pode guardar o resultado de todos os cmdlets em variáveis. $Arquivos = Get-ChildItems ou $Arquivos = dir Quando há vários arquivos, ûm Array de Objetos é retornado: $Arquivos[0] $Arquivos[1] Veremos mais sobre objetos à frente. 9
Como boa parte das linguagens de programção e de script, o powershell permite que você use a memória do computador para guardar algum valor. Essa memória é alocada através do uso de variáveis. Variáveis são pequenas porções de memória que você pode guardar o que você quiser. Você precisa dar um nome para cada variável que criar. Por exemplo, vamos definir uma variável chamado Arquivos: $Arquivo; Toda variável começa com $, seguido do nome. Para atribuir algum valor a uma variável, basta usar a seguinte sintaxe: $Arquivos = C:\temp\texto.txt Você pode definir um tipo de dados. Se você define um tipo de dados, a variável só poderá receber valores daquele tipo. [string]$arquivos = C:\temp\texto.txt 10
[int]$quantidade = 100 Lembre-se: As variáveis são uma forma, mais compreensível para humanos, de alocar memória do computador. Ao usar variáveis, você está usando alguma parte da memória para guardar o seu conteúdo. Você pode guardar vários valores em uma mesma variável. Estes são os famosos Arrays ou vetores: $Arquivos = C:\temp\texto.txt, C:\temp\text2.txt $Servidores = SERVER1, SERVER2, SERVER3 $Numeros = 1,2,3,4,5,6 Um Array é como um armário, com vários compartimentos. Para acessar um desses compartimanetos você usa um número, o que chamamos de índice : $Arquivos[0] $Servidores[2] $Numeros[3] Você também pode definir um array que só aceita compartimentos de um determinado tamanho, ou, em melhores palavras, de um determinado tipo. Basta especificar o tipo de dado, seguido de [] (sem aspas): [string[]]$servidores = SERVER1, SERVER2, SERVER3 [int[]]$numeros = 1,2,3 É importante entender Arrays porque a maioria dos cmdlets retornam uma lista de objetos, ou melhor dizendo, uma array de objetos. Mais adiante, iremos falar sobre isso. 10
Os tipos de dados restrigem o que pode ser guardado em um variável. Tipos de dados são importantes, pois quando você precisa trabalhar com valores de diferentes tipos, você pode evitar problemas com conversões implícitas de um tipo de dado para outro. Ao saber qual tipo de dado um variável carrega, o powershell pode fazer certas melhorias. Você deve sempre se preocupar em escolher os tipos de dados corretos baseados nos valores que planeja guardar em variáveis. 11
Um Array é semelhante a um gaveteiro. Por exemplo, em um gaveteiro com quatro gavetas, você pode guardar roupas na primeira gaveta, livros na segunda e por aí vai. Se quiser, por exemplo, pedir alguém que pegue um livro, você dirá, Pegue um livro que está na segunda gaveta. O mesmo vale para quando você quer guardar um livro. Você pode pensar devo guardar este livro na segunda gaveta. No powershell, as variáveis podem se comportar como gaveteiros. Isto é, uma variável pode ter vários compartimentos. Isso te permite guardar vários valores em uma mesma variável. Você pode acessar cada gaveta usando um número, que é o número correspondente da gaveta, ou, a posição do array que deseja acessar. Você usa a sintaxe $NomeVariavel[Numero] onde Número é a posição do array que quer acessar. Diferentemente como fazemos no dia-a-dia, em um array a primeira gaveta é 0, e não 1. Assim, se quiser acessar a primeira posição, você usa $NomeVariável[0]. A quarta gaveta seria o 3. 12
Nesta demo, vamos apenas observar como variáveis podems ser úteis, para guardar o resultado de cmdlets, por exemplo. Existe um cmdlet chamado Get-Date. Ele retorna a data atual. Se você executar Get-Date três vezes, então três datas diferentes serão retornadas, por conta dos segundos. Get-Date Get-Date Get-Date Porém, se você guardar o valor em uma variável, e exibir estas variáveis três vezes, então o mesmo valor sempre será exibido. $Data = Get-Date $Data $Data $Data 13
Você pode guardar o resultado de todos os cmdlets em variáveis. $Arquivos = Get-ChildItems ou $Arquivos = dir Quando há vários arquivos, ûm Array de Objetos é retornado: $Arquivos[0] $Arquivos[1] Veremos mais sobre objetos à frente. 13
Uma das grandes vantagens em relação aos Prompt de Comando ou o Bash, no Linux, é que todos os cmdlets retornam objetos, e não texto (string). Isto significa que você pode acessar e transportar a informação de maneira mais flexível entre os cmdlets, eliminando a necessidade de buscar partes de uma string. A definição de objeto é bem ampla e vem da orientação à objetos. Mas, para esta apresentação, pense que um objeto é apenas um pedaço de memória, onde cada parte da memória pode ser acessada individualmente. Isso permite armazenar várias informações, ao mesmo tempo que podemos acessá-la indidualmente. Por exemplo, no antigo Prompt de Comando, o comando dir, retorna uma string, com várias linhas, onde cada linha possui um arquivo. No caso do powershell, o comando Get-ChildItem (que tem um alias dir ) retorna um array de objetos, onde cada elemento do array, contém um objeto que representa as informações do arquivo. Considere, o seguinte comando: $Arquivo = Get-Item C:\temp\Arquivo.txt 14
Estamos guardando na variável $Arquivo, o resultado de Get-Item. Este comando retorna um objeto que representa o arquivo em questão. Ele contém todas as informações a respeito do arquivo, como o nome completo, data de modificação, etc. E este objeto, estamos guardando na variável $Arquivo. Veja o conteúdo: $Arquivo Interessante certo!? Perceba que uma espécie de tabela é imprimida na tela. É possível acessar cada informação, individualmente. Por exemplo: $Arquivo.LastWriteTime O nome do arquivo: $Arquivo.Name Isto são propriedades. Todos os objetos possuem propriedades. Propriedades são como variáveis, porém cada objeto tem sua propriedade e valor. Você pode ler indivualmente, bem como gravá-las. Como eu sei quais propriedades um objeto possui? Você precisa consultar a documentação do cmdlet que retorna o objeto e saber qual tipo do objeto que ele retorna. Ou você pode usar um cmdlet chamado Get-Member que retorna todas as propriedades que existem em um objeto. Get-Member $Arquivo 14
Você pode acessar as propriedades de um objeto usando o. Por exemplo, $Data = Get-Date Agora, a variável $Data contém um objeto. Você pode acessar certas propriedades dessa forma: $Data.Day Isso retorna o valor do dia respectivo a data. Você pode usar os parênteses para forçar a execução do cmdlet. Isso permite acessar as suas propriedades sem salvá-lo em uma variável: (Get-Date).Day (Get-Date).Second (Get-Date).Second 15
Note que este método retorna um novo objeto sempre que é executado, e isso faz com que os segundos sejam diferentes. Se você executar este código às 23:59:59, e depois às 00:00:00, do próximo dia, verá que os dias retornados também são diferentes. Isso seria diferente se não guardasse em uma variável. Você pode usar o cmdlet Get-Member para ver as propriedades que existem em um objeto. Get-Member InputObject (Get-Date) Ou $d = Get-Date Get-Member InputObject $d Você verá que com o uso de pipeline, isso é mais fácil. Adiantando, você também poderá fazer assim, que é o método mais usado: Get-Date Get-Member 15
O pipeline é um recuso muito interessante e a maioria dos shells tem algo parecido. Em resumo, um pipeline é forma de passar o resultado de um comando, para outro comando. Assim o próximo comando pode realizar os mais variados processamentos, como filtrar objetos, ordená-los, etc. Você usa o símbolo (chamado pipe) para separar os comandos. Por exemplo: Get-ChildItem Select-Object Name Há dois cmdlets neste exemplo, que estão ligados pelo símbolo do pipe. Estes dois objetos cmdlets, ligados pelo PIPE, formam o que chamamos de pipeline. O pipeline é composto por dois ou mais cmdlets. O que o exemplo acima faz é obter todos os arquivos do diretório atual, através do comando Get-ChildItem, e para cada objeto retornado, ele apenas traz a propriedade Name. O pipeline é como ir ao subway. Primeiro, você escolhe o tamanho do pão, tipo, queijo e adiocionais. Depois ele é aquecido no forno. E por último você escolhe os molhos. Cada etapa é como se fosse um cmdlet no pipeline. O objeto é o sanduíche que vai sendo tratado conforme ele passa pelas etapas (cmdlets). 16
No Prompt de comando, e no bash, do Linux, o que era passado de um comando para outro eram apenas strings. Você tinha que usar diversos comandos capazes de pesquisar e extrair trechos de strings para obter a informação desejada, ou fazer o processo adeuqado. 16
Você pode usar o pipelin para aplicar diversas transformações em seu resultado. Você pode ordenar uma lista de arquivos, usando Sort-Object: Get-ChildItem Sort-Object Property Name Alguns cmdlets permitem que você use scriptblocks para realizar algum processamento. Scriptsblocks são pedaços de scripts que podem ser executados dentro do powershell. Você pode usar a variável especial $_ para acessar o objeto que está passando atualmente pelo cmdlet. O cmdlet Where-Object é um exemplo: Get-ChildItem Where-Object {$_.Name like *abc* } No exemplo acima, para cada arquivo retornado por Get-ChildItem, nós vamos usar o Where-Object para filtrar somente aqueles que possuem abc no nome. O resto será descartado. 17
Assim como existem os arquivos.bat existem os arquivos.ps1. Você pode criar arquivos.ps1 e executá-los via powershell. Você pode usar a mesma sintaxe que usa na linha de comando. Para executar o arquivo, basta colocar o caminho completo do mesmo, ou se estiver no diretório atual, usar.\nomearquivo.ps1. Exemplo: Obtem-Arquivos.ps1 Get-ChildItems Select Name Para executar este arquivo, se estiver no mesmo diretório:.\obtem-arquivos.ps1 Se estiver em outro diretório, o arquivo estiver em C:\temp C:\temp\Obtem-Arquivos.ps1 18
Você pode incluir parâmetros através da cláusula param : Exemplo de C:\temp\Obtem-Arquivos.ps1 : Param($Diretorio) Get-ChildItems $Diretorio Select Name 18
19
https://technet.microsoft.com/pt-br/library/bb978526.aspx (Português) https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx (Inglês) https://technet.microsoft.com/pt-br/scriptcenter/dd742419.aspx (Português) www.thesqltimes.com 20
21