Ei - espero que você esteja bem.
Quero dedicar alguns minutos para você começar a usar o PowerShell, de uma maneira que acho menos esmagadora do que encontrei a maior parte do material do PowerShell no passado. Porque você me disse que continua ouvindo sobre o PowerShell e que não sabe como entrar nele.
A primeira coisa a saber é que parece o Prompt de Comando com esteróides, mas muito mais útil que o Prompt de Comando. Você verá o que quero dizer assim que abri-lo. Vamos fazer isso, mas vamos abri-lo usando 'Executar como administrador', porque isso ajuda para algumas das demos. Na vida real, você só abrirá com direitos de administrador se realmente precisar.
Então clique no botão Iniciar e comece a digitar PowerShell. Não quero que você abra o ISE (ainda), apenas encontre o atalho “Windows PowerShell” e clique com o botão direito do mouse para escolher ‘Executar como administrador’.
Agora que está em execução, fixe-o na barra de tarefas, para que você possa acessá-lo mais rapidamente da próxima vez. Se você vai tentar adotar o PowerShell, deve facilitar a abertura.
De qualquer forma, aquela janela… imediatamente parece que você precisa ter uma ideia do que escrever. Sim está certo. As coisas podem ter sido um pouco mais fáceis no ISE, e Aaron Nelson (@sqlvariant) me repreendeu por não usar o ISE toda vez que faço algo no PowerShell, mas ficaremos bem aqui.
Vamos começar fazendo algumas coisas básicas que conhecemos do DOS. Os comandos
cd
e dir
. Tente isto:cd .. dir
Você verá que subiu para
C:\WINDOWS
e, em seguida, liste o conteúdo. Sem surpresas aqui, é como o Prompt de Comando. Ou DOS se você tiver idade suficiente. A diferença com o PowerShell é que isso não é apenas saída de texto. Essas coisas são objetos . E podemos fazer coisas com isso. O PowerShell é um ambiente 'digitado'. Você já lida com objetos o tempo todo, como no Object Explorer no SSMS. Os objetos do PowerShell podem incluir todas essas coisas, bem como objetos .Net. É aqui que o PowerShell obtém seu poder.
Algumas coisas rápidas…
- Os comandos do PowerShell vêm em pares verbo-substantivo, como
Set-Location
ouGet-Content
ouGet-ChildItem
. Eles são conhecidos como cmdlets, portanto, quando você vê a palavra 'cmdlet', significa apenas um comando do PowerShell. - Os parâmetros de comando do PowerShell usam um hífen. Como:
Get-ChildItem -Recurse
mas você também pode abreviá-los, desde que não haja ambiguidade. Então eu poderia usar-rec
em vez de-recurse
. - As variáveis começam com um cifrão (
$
). Chegaremos a isso mais tarde. - Não usamos
>
em filtros e testes, usamos-gt
.-eq
para=
,-ne
para!=
/<>
,-le
para<=
, e assim por diante. Isso é frustrante, mas você vai se acostumar com isso. - Existem várias abreviações e apelidos. Um alias para
Set-Location
écd
.Get-ChildItem
também é conhecido comodir
els
também.Where-Object
é?
eForEach-Object
é%
. Veremos isso à medida que avançamos também. - Você obtém preenchimento de tabulação em quase tudo, então, se você digitou
Get-Chi
, você pode clicar em Tab e percorrer as opções até encontrar o que deseja. - Você pode usar a ajuda (que é um alias para
Get-Help
) simplesmente usando:help dir
, e na parte inferior dessa ajuda, você receberá um bom lembrete de que poderia ter usadohelp dir -examples
, e que adicionar-online
teria aberto uma página da web com a página de ajuda relevante (isso é muito útil). - Você pode passar os resultados de uma coisa para outra usando o símbolo de barra vertical (
|
). Talvez o mais útil sejagm
(um alias paraGet-Member
), que listará as Propriedades e Métodos (os membros) para qualquer objeto que você tenha passado. #
comentará a linha ou ficará entre<#
e#>
Vamos ver um pouco disso em ação.
Aqui podemos ver algumas coisas interessantes. É bom notar que poderíamos usar
-Exclude
e -Include
. Faremos isso em breve. Poderíamos obter mais informações usando -detailed
, ou -examples
, ou -full
. Vamos explorar nossa pasta SQL. Comece digitando
cd \p
e, em seguida, pressione Agora pressione M e comece a pressionar Tab novamente para encontrar 'Microsoft SQL Server'. Se você for muito longe, pressione Shift-Tab para voltar. (Ah, e se você deveria estar olhando em
D:
, depois comece novamente com cd D:\p
– mas os princípios são os mesmos.) Excelente. Vamos pressionar Enter e ver que alteramos o diretório.
Mas agora vamos digitar:
dir -rec -inc ConfigurationFile.ini
Você poderia pressionar Tab após cada parâmetro e vê-los se expandir para as versões mais corretas. Você poderia ter usado
Get-ChildItem
ser um pouco mais rigoroso. Eu realmente não me importo. Ao executar isso, você verá alguns arquivos listados. Não sei quantos você vai conseguir. Cada um indica que você executou uma instalação do SQL Server. Mas como um especialista em SQL, você sabe disso. Você pode não saber com que facilidade o PowerShell poderia listá-los para você. OK. Espero que estejamos vendo algum uso para isso.
Agora vamos fazer algo com essa saída. Eu quero dizer 'com esses arquivos', mas vamos fazer a coisa dos dados e pensar nisso como um conjunto de dados de arquivos.
Suponha que queremos contá-los. Eu poderia percorrer os resultados usando
ForEach-Object
(mas vou usar o atalho %
) e incremente uma variável que eu configurei. Este é um padrão comum para looping – as pessoas colocam programas inteiros dentro desses colchetes, em muitas linhas. Isso funciona, mas tenho certeza de que há algo embutido para me permitir contar as coisas.
Bem, eu nunca consigo lembrar qual é o comando, então vamos perguntar a um desses provedores de pesquisa na Internet.
Eu nem quero abrir essas páginas. Eu só quero notar que existe um comando chamado
Measure-Object
. Vamos canalizar nossa saída para isso. Pressione a tecla 'seta para cima' para voltar a um comando anterior. Isso leva um momento, e então felizmente nos diz que são três.
Demora um momento porque está tendo que pesquisar os arquivos novamente. Que tal armazenarmos esses resultados em algum lugar?
Agora, eu chamo essas coisas de colchetes, mas os americanos as chamam de parênteses. E o que você chama de colchetes, eu chamo de colchetes. Há colchetes também, que você chama de chaves, eu acho. Vou tentar chamar os parênteses de 'colchetes' para evitar confusão, mas se me refiro a um 'colchete', quero dizer um parêntese.
Vou envolver meu
dir
comando entre colchetes e atribua isso a uma variável. Agora posso canalizar
$configfilelist
em Measure-Object
e será mais responsivo, porque armazenei meus resultados. Mas porque
$configfilelist
é uma matriz de arquivos, também posso observar seu comprimento para ver que existem três itens. Isso é bem mais fácil. E posso acessar cada um individualmente usando colchetes de 0 a 2. Isso ainda não é exatamente algo inovador. Mas esses arquivos nos dizem algumas coisas úteis. Vamos fazer um
Get-Member
comando em nossa matriz. Não se deixe abater por isso. No topo podemos ver que estamos lidando com objetos que são do tipo
System.IO.FileInfo
. Isso é uma coisa .Net e é de onde vem o poder. Podemos ver que poderíamos chamar o método Delete
métodos desses arquivos, ou CopyTo
, ou Decrypt
(se eles foram criptografados, mas não são) e muito mais. Abaixo, vemos Propriedades. Isso é mais interessante. Vejamos
LastWriteTime
. Porque podemos estar interessados em quando isso acontece. Podemos usar
Select-Object
para mostrar apenas algumas propriedades. Como esperado, nada é gravado nesses arquivos desde que as instalações foram realmente feitas. Mas e se eu quisesse filtrar isso, apenas para aqueles desde um determinado ponto no tempo?
Vou usar
Get-Date
para obter a data e hora atuais. Vou colocar isso entre colchetes e usar seu AddYears
método para encontrar um ano atrás. No mundo real, eu estaria mais inclinado a usar AddDays
, mas eu quero obter alguns resultados. E vou filtrar
$configfilelist
passando para Where-Object
(exceto que vou usar um atalho conveniente que é o ponto de interrogação). Meu filtro fica dentro de chaves ('chaves', certo?), e dentro dessas chaves eu me refiro às coisas em $configfilelist
usando $_
. Então meu filtro fica assim, dizendo que quero listar os que têm um
LastWriteTime
maior que (-gt
) um ano antes:E eu só recebo um arquivo. Formidável.
Isso é muito bom, mas agora eu quero saber do que se tratava essa instalação. Para isso, precisamos olhar dentro do arquivo.
Get-Content
é nosso amigo aqui. Vamos começar usando Get-Content
diretamente contra um arquivo. Será fácil conectá-lo ao nosso comando adequado mais tarde. Get-Content
na verdade retorna uma matriz de linhas e tem parâmetros realmente úteis como -TotalCount
que para após um certo número de linhas, ou -Tail
que obtém linhas no final do arquivo. Adoro isso quando estou lidando com arquivos grandes - não é como se eu pudesse abri-los no Bloco de Notas. Deixe-me falar sobre Select-String também. É como
grep
do Unix – você o usa para obter as linhas que deseja em um arquivo. Essa saída parece uma dor, mas lembre-se que esta é apenas a representação de string de um objeto. Se eu canalizar meu comando para
gm
(Get-Member
), você verá o que quero dizer. Então agora posso dizer que posso acessar o
Path
do arquivo, a Line
, o LineNumber
, etc., separadamente. Para procurar várias coisas, quero passar uma matriz de parâmetros para
-Pattern
. Eu faço isso simplesmente usando uma vírgula, para descobrir que era uma instalação do Analysis Services. Espero que você esteja começando a ver o poder disso.
Eu posso soltar tudo em uma linha usando:
dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line
(Desculpe, você provavelmente terá que rolar para o lado para ver tudo isso – colocar tudo em uma única linha não é exatamente uma virtude em HTML.)
Quando estiver resolvendo as coisas que gosta, você vai querer armazenar os comandos em algum lugar para mais tarde (como em um arquivo .ps1 que você executa). Para isso, você deve estar ciente de
Get-History
. Ele lista tudo o que você executou nessa sessão. E um pequeno truque legal é que você pode usar números negativos para se conectar a matrizes do outro lado. Então você pode fazer isso:
Mas em vez de apenas exibi-lo, canalize-o para
clip
:…que o coloca na área de transferência.
Eu não vou ir muito mais longe com isso, mas você pode continuar levando isso cada vez mais longe, explorando os tipos de coisas que podem ser interessantes em seu trabalho. Você pode despejar resultados em arquivos usando
>
e anexar a arquivos usando >>
. Agora considere comandos como:
Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error
… e imagine o que você poderia fazer com isso.
Tente fazer:
Import-Module SQLServer
Que então deixa você ir:
cd SQLSERVER:
E navegue no ambiente SQL como se fosse um sistema de arquivos.
Eu não costumo usar o PowerShell para explorar SQL assim com muita frequência, devo admitir. Mas o fato de que eu posso certamente me dá um monte de opções. O fato de eu poder usar o PowerShell para criar um documento do Word como eles fazem em https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/ ou enviar e-mails conforme descrito em https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage ou ligue para os serviços da Web (incluindo os do Azure Machine Learning) conforme descrito em https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest significa que, com um pouco de imaginação, você pode usar o PowerShell para fazer praticamente o que quiser. Adoro usar Invoke-SqlCommand para obter dados do SQL, enviá-los para
Invoke-WebRequest
para obter pontuações do Azure ML e, em seguida, responda de acordo. O PowerShell torna isso realmente simples. Ah, e para executar comandos do PowerShell em outras máquinas (o que pode ser bastante útil, é claro), uma rápida 'pesquisa na internet' me mostrou esta página de aparência útil:https://www.howtogeek.com/117192/how-to -run-powershell-commands-on-remote-computers/
Você pode ter uma lista de computadores dentro de um arquivo e fazer um loop por ele assim:
Experimente algumas coisas. Nocauteie-se. E explore o que todo mundo está escrevendo para o T-SQL na terça-feira deste mês, apresentado por Rob Sewell (@sqldbawithbeard)
@rob_farley