Historicamente, as utilidades de linha de comando em sistemas Unix foram melhor desenvolvidas do que em Windows, mas com o surgimento dessa nova solução, a situação mudou.
O Windows PowerShell permite que administradores de sistemas automatizem a maioria das tarefas rotineiras. Com ele, é possível alterar configurações, parar e iniciar serviços, além de realizar a manutenção da maioria das aplicações instaladas. Considerar a janela azul como mais um interpretador de comandos seria inadequado. Essa abordagem não reflete a essência das inovações propostas pela Microsoft. Na verdade, as capacidades do Windows PowerShell são muito mais amplas: em uma pequena série de artigos, tentaremos entender como a solução da Microsoft se diferencia dos meios com os quais estamos mais acostumados.
Principais funcionalidades
Certamente, o Windows PowerShell é, antes de tudo, um shell de comando com uma linguagem de script, originalmente criada sobre a plataforma .NET Framework, e mais tarde – sobre o .NET Core. Ao contrário de shells que aceitam e retornam dados textuais, o Windows PowerShell trabalha com classes .NET, que possuem propriedades e métodos. O PowerShell permite executar comandos comuns, além de dar acesso a objetos COM, WMI e ADSI. Utilizam-se diversos repositórios, como o sistema de arquivos ou o registro do Windows, para os quais são criados os chamados provedores. É importante destacar a possibilidade de incorporar componentes executáveis do PowerShell em outros aplicativos para realizar diversas operações, inclusive através de interface gráfica. O inverso também é verdade: muitos aplicativos para Windows oferecem acesso às suas interfaces de controle através do PowerShell.
O Windows PowerShell permite:
- Alterar configurações do sistema operacional;
- Gerenciar serviços e processos;
- Configurar funções e componentes do servidor;
- Instalar software;
- Gerenciar software instalado através de interfaces especiais;
- Incorporar componentes executáveis em programas de terceiros;
- Criar scripts para automação de tarefas administrativas;
- Trabalhar com o sistema de arquivos, registro do Windows, repositório de certificados, etc.
Shell e ambiente de desenvolvimento
O Windows PowerShell existe em duas versões: além do emulador de console com a interface de linha de comando, há o Ambiente de Scripting Integrado (Integrated Scripting Environment - ISE). Para acessar a interface de linha de comando, basta escolher o atalho correspondente no menu do Windows ou executar powershell.exe a partir do menu 'Executar'. Na tela, aparecerá uma janela azul que difere consideravelmente em suas capacidades do antigo cmd.exe. Lá, há autocompletar e outros recursos habituais para usuários de terminais Unix.

Para trabalhar com o shell, é necessário memorizar algumas combinações de teclas:
- As setas para cima e para baixo percorrem o histórico para repetir comandos anteriormente digitados;
- A seta para a direita no final da linha reescreve o comando anterior caracter por caracter;
- Ctrl+Home exclui o texto digitado do cursor até o início da linha;
- Ctrl+End exclui o texto do cursor até o final da linha.
F7 exibe uma janela com os comandos digitados e permite escolher um deles. No console, também é possível selecionar texto com o mouse, copiar e colar, posicionar o cursor, excluir, backspace — tudo como gostamos.

O Windows PowerShell ISE é um ambiente de desenvolvimento completo com um editor de código que suporta abas e realce de sintaxe, construtor de comandos, depurador embutido e outras ferramentas agradáveis para programadores. Se você escrever um hífen após o nome do comando no editor do ambiente de desenvolvimento, verá uma lista suspensa com todos os parâmetros disponíveis, indicando o tipo. Você pode iniciar o PowerShell ISE através de um atalho no menu do sistema ou usando o arquivo executável powershell_ise.exe.

Cmdlets
No Windows PowerShell, surgiram os chamados cmdlets. Estes são classes especializadas do .NET, que incorporam diversas funcionalidades. Eles são nomeados segundo o princípio 'Ação-Objeto' (ou 'Verbo-Substantivo', se você preferir), e a ligação separada por hífen lembra o sujeito e o predicado em frases de línguas naturais. Por exemplo, Get-Help significa literalmente 'Obter-Ajuda' ou, no contexto do PowerShell: 'Mostrar-Ajuda'. Na prática, isso é análogo ao comando man nos sistemas Unix, e os manuais no PowerShell devem ser solicitados exatamente assim, não usando cmdlets com a chave —help ou /?. Além disso, não deve-se esquecer da documentação online do PowerShell: a da Microsoft é bastante detalhada.
Além do Get, outros verbos (e não apenas verbos, estritamente falando) são usados nos cmdlets para indicar ações. Abaixo, listamos alguns exemplos:
Adicionar — adicionar;
Limpar — limpar;
Habilitar — ativar;
Disable — desativar;
Novo — criar;
Remove — remover;
Definir — definir;
Iniciar — iniciar;
Stop — parar;
Export — exportar;
Importar — importar.
Existem cmdlets de sistema, do usuário e opcionais: como resultado da execução, todos retornam um objeto ou um array de objetos. Eles não são sensíveis a maiúsculas, ou seja, do ponto de vista do interpretador de comandos, não há diferença entre Get-Help e get-help. O símbolo ‘;’ é usado para separação, mas deve ser colocado obrigatoriamente apenas se vários cmdlets forem executados em uma única linha.
Os cmdlets do Windows PowerShell são agrupados em módulos (NetTCPIP, Hyper-V, etc.), e para pesquisa de objeto e ação existe o cmdlet Get-Command. Para mostrar a ajuda sobre ele, pode-se usar:
Get-Help Get-Command 
Por padrão, o comando exibe um resumo da ajuda, mas parâmetros (argumentos) podem ser passados para os cmdlets, se necessário. Com eles, por exemplo, é possível obter informações detalhadas (parâmetro -Detailed) ou completas (parâmetro -Full), além de exibir exemplos na tela (parâmetro -Examples):
Get-Help Get-Command -ExamplesA ajuda no Windows PowerShell é atualizada com o cmdlet Update-Help. Se a linha de comandos for muito longa, os argumentos do cmdlet podem ser movidos para a próxima linha, escrevendo o caractere especial ‘`’ e pressionando Enter — simplesmente terminar a escrita do comando em uma linha e continuar na outra não é possível.
Abaixo estão alguns exemplos de cmdlets comuns:
Get-Process — mostrar os processos em execução no sistema;
Get-Service — mostrar serviços e seu status;
Get-Content — exibir o conteúdo de um arquivo.
Para cmdlets frequentemente usados e utilitários externos, o Windows PowerShell tem sinônimos curtos — aliases (do inglês Alias). Por exemplo, dir é o alias de Get-ChildItem. A lista de sinônimos também inclui análogos de comandos de sistemas Unix (ls, ps, etc.), e o cmdlet Get-Help é chamado pelo comando help. A lista completa de sinônimos pode ser visualizada usando o cmdlet Get-Alias:

Scripts, funções, módulos e a linguagem PowerShell
Os scripts do Windows PowerShell são armazenados como arquivos de texto simples com a extensão .ps1. Não é possível executá-los com um duplo clique: é necessário clicar com o botão direito do mouse, abrir o menu de contexto e escolher a opção 'Executar no PowerShell'. A partir do console, você terá que especificar o caminho completo para o script ou navegar até o diretório correspondente e digitar o nome do arquivo. A execução de scripts também é limitada pela política do sistema, e para verificar as configurações atuais você pode usar o cmdlet Get-ExecutionPolicy, que retornará um dos seguintes valores:
Restricted — a execução de scripts está desativada (padrão);
AllSigned — apenas a execução de scripts assinados por um desenvolvedor confiável é permitida;
RemoteSigned — a execução de scripts assinados e scripts próprios é permitida;
Unrestricted — a execução de quaisquer scripts é permitida.
O administrador tem duas opções. A mais segura envolve assinar scripts, mas isso é uma tarefa bastante complexa — vamos abordar isso em artigos futuros. Agora, vamos optar pelo caminho de menor resistência e mudar a política:
Set-ExecutionPolicy RemoteSigned 
O PowerShell precisará ser executado como administrador para isso, embora, com um parâmetro especial, você possa alterar a política também para o usuário atual.
Os scripts são escritos em uma linguagem de programação orientada a objetos, cujos comandos são nomeados de acordo com o mesmo princípio que os cmdlets abordados anteriormente: 'Ação-Objeto' ('Verbo-Substantivo'). Sua principal finalidade é automatizar tarefas administrativas, mas é uma linguagem interpretada completa, com todas as estruturas necessárias: condicionais, loops, variáveis, arrays, objetos, tratamento de erros, etc. Qualquer editor de texto pode ser usado para escrever scripts, mas é mais conveniente iniciar o Windows PowerShell ISE.
Parâmetros podem ser passados para o script, tornando-os obrigatórios, além de definir valores padrão. Além disso, o Windows PowerShell permite criar funções e chamá-las da mesma forma que os cmdlets: para isso, utiliza-se a construção Function e chaves. Um script com funções é chamado de módulo e tem a extensão .psm1. Os módulos devem ser armazenados em diretórios definidos nas variáveis de ambiente do PowerShell. Você pode visualizar esses diretórios com o seguinte comando:
Get-ChildItem Env:PSModulePath | Format-Table -AutoSizeCorretores
No último exemplo, aplicamos uma construção familiar aos usuários de shells de sistemas Unix. No Windows PowerShell, o pipe vertical também permite passar a saída de um comando para a entrada de outro, mas na implementação do pipeline há uma diferença significativa: já não se trata apenas de um conjunto de caracteres ou de algum texto. Cmdlets embutidos ou funções personalizadas retornam objetos ou arrays de objetos, e também podem recebê-los como entrada. Assim como no Bourne shell e seus numerosos seguidores, no PowerShell, o uso do pipeline simplifica a execução de tarefas complexas.
Um exemplo simples de pipeline é assim:
Get-Service | Sort-Object -property Status 
Primeiro, o cmdlet Get-Service é executado, e então todos os serviços obtidos são passados para a ordenação pelo atributo Status no cmdlet Sort-Object. Qual argumento recebe o resultado do trecho anterior do pipeline depende de seu tipo — geralmente é o InputObject. Este assunto será tratado com mais detalhe em um artigo dedicado à linguagem de programação PowerShell.
Se desejado, a cadeia pode ser continuada e o resultado do Sort-Object pode ser passado para outro cmdlet (eles serão executados da esquerda para a direita). A propósito, os usuários do Windows também têm uma construção familiar para saída paginada:
Get-Service | Sort-Object -property Status | moreExecutando tarefas em segundo plano
Frequentemente é necessário iniciar um comando em segundo plano, para não ter que esperar pela conclusão de sua execução na sessão da shell. No Windows PowerShell, há vários cmdlets para tal situação:
Start-Job — iniciar uma tarefa em segundo plano;
Stop-Job — parar uma tarefa em segundo plano;
Get-Job — visualizar a lista de tarefas em segundo plano;
Receive-Job — visualizar o resultado da execução de uma tarefa em segundo plano;
Remove-Job — remover uma tarefa em segundo plano;
Wait-Job — retornar uma tarefa em segundo plano de volta ao console.
Para iniciar uma tarefa em segundo plano, usamos o cmdlet Start-Job e indicamos o comando ou conjunto de comandos entre chaves:
Start-Job {Get-Service} 
As tarefas em segundo plano no Windows PowerShell podem ser manipuladas conhecendo seus nomes. Primeiro, vamos aprender a listá-las:
Get-Job 
Agora mostramos o resultado da tarefa Job1:
Receive-Job Job1 | more 
Tudo é bastante simples.
Execução remota de comandos
O Windows PowerShell permite executar comandos e scripts não apenas em um computador local, mas também em um computador remoto e até mesmo em um grupo inteiro de máquinas. Existem várias maneiras de fazer isso:
- Muitos cmdlets têm um parâmetro
-ComputerName, mas dessa forma não será possível, por exemplo, criar um pipeline; - O cmdlet
Enter-PSSessionpermite criar uma sessão interativa em uma máquina remota; - Com o cmdlet
Invoke-Commandé possível executar comandos ou scripts em um ou mais computadores remotos.
Versões do PowerShell
Desde o seu primeiro lançamento em 2006, o PowerShell mudou significativamente. A ferramenta está disponível para diversos sistemas que operam em diferentes plataformas de hardware (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux e OS X. O último lançamento, 6.2, foi feito em 10 de janeiro de 2018. Scripts escritos para versões anteriores têm uma alta probabilidade de funcionar em versões mais recentes, mas podem surgir problemas de retrocompatibilidade, já que, ao longo dos anos, o PowerShell ganhou uma grande quantidade de novos cmdlets. Para descobrir a versão do shell de comando instalada no computador, pode-se usar a propriedade PSVersion da variável embutida $PSVersionTable:
$PSVersionTable.PSVersion 
Você também pode usar o cmdlet:
Get-Variable -Name PSVersionTable –ValueOnly 
O mesmo pode ser feito usando o cmdlet Get-Host. Na verdade, há muitas opções, mas para aplicá-las, é necessário estudar a linguagem de programação PowerShell, o que faremos no .
Resultados
A Microsoft conseguiu criar um shell de comando realmente poderoso, com um ambiente integrado conveniente para o desenvolvimento de scripts. O que o distingue das ferramentas familiares do mundo Unix é a profunda integração com sistemas operacionais da família Windows, bem como com software para eles e a plataforma .NET Core. O PowerShell pode ser considerado um shell orientado a objetos, pois cmdlets e funções personalizadas retornam objetos ou arrays de objetos e podem recebê-los como entrada. Acreditamos que todos os administradores de servidores Windows devem dominar essa ferramenta: chegou a hora em que eles não podem mais se virar sem a linha de comando. Um shell de console avançado é especialmente necessário em , mas essa é uma história completamente diferente.
Apenas usuários registrados podem participar da pesquisa. , por favor.
Quais temas devemos abordar primeiro nos próximos artigos da série?
53,2%Programação em PowerShell123
42,4%Funções e módulos PowerShell98
22,1%Como assinar seus próprios scripts?51
12,1%Trabalhando com repositórios através de provedores (providers)28
57,6%Automatização da administração de computadores com PowerShell133
30,7%Gerenciamento de software e integração de componentes executáveis do PowerShell em produtos de terceiros71
231 usuários votaram. 37 usuários se abstiveram.
Fonte: habr.com
