Cmd ou Powershell? Qual utilizar?

As ferramentas de linha de comando nos possibilitam realizar uma infinidade de operações que vão desde obter uma simples informação até a execução de manobras que envolvem alterações em massa. Tarefas essas que se fossemos realizar através da interface gráfica, além de demorar um milhão de vezes mais a depender do volume, ainda teríamos a sensação de ver o tempo sendo desperdiçado com algo que de repente poderia ter sido automatizado. Nesse sentido, o valor das ferramentas de linha de comando é realmente inquestionável.

Leia mais:

Os melhores cursos de Windows Server de 2021
Como evitar o compartilhamento de senha em período de férias via Powershell
WSL — Linux no Windows
Descubra quais funcionalidades você perderá ao migrar para o Windows 11
Como utilizar o comando Help do PowerShell

Cmd ou Powershell.exe?

De um lado temos nosso querido prompt de comando, o Cmd, interpretador de comandos padrão do Windows. Do outro temos o powershell.exe, a console através da qual interagimos com a tecnologia Powershell.

Desde 2006, em sua primeira versão, o Windows Powershell vem sendo aprimorado, milhares de cmdlets foram adicionados ou atualizados e, a forma que nós administradores trabalhamos tem sido fortemente influenciada com essa evolução. O Windows Server 2012 por exemplo, que trazia consigo a versão 3, já podia ser praticamente todo gerenciado apenas com Windows Powershell.

Mas a pergunta persiste, porque optar pelo Powershell no lugar do prompt de comandos?
Alguém poderia dizer: – Ah, dá para fazer muito mais coisas com Powershell.

Será?

Conseguimos manipular arquivos e pastas com Powershell e vários outros contextos do sistema de arquivos. Com o prompt também.

É possível realizar operações no registro do windows com Powershell. Com o prompt também.

Com Powershell podemos realizar tarefas avançadas envolvendo classes WMI e objetos COM. Com o prompt também.

Com Powershell podemos automatizar uma série de tarefas através de scripts incluindo estruturas de decisão e laços de repetição. Com o prompt também.

Claro, os exemplos acima não são nem de longe exaustivos, mas dá para termos uma visão de que as duas ferramentas se mostram fortes candidatas na hora de realizar operações administrativas.

Outro alguém poderia dizer: – Certo, as duas ferramentas têm seu valor, mas não dá nem para comparar o quão intuitivo, amigável e prático é o Windows Powershell em comparação ao prompt.

Pessoalmente eu concordo. O Windows Powershell é muito mais amigável, intuitivo e prático, e, talvez só esses predicados já seriam suficientes na hora de optar por ele ao invés de um outro. Contudo o abismo que faz separação entre as duas ferramentas é ainda maior e mais profundo.

Existe uma diversidade enorme de ferramentas de linha de comando por aí, contudo vamos nos ater a essas duas.

As aparências enganam!

Faça um teste. Inicie as duas ferramentas e execute o comando ipconfig em cada uma delas.

Nada demais, concorda? Fora questões visuais como cor e fonte, as duas ferramentas de linha de comando mostraram o resultado da execução do utilitário ipconfig.

Se pudéssemos obter um raio-X, uma ressonância ou algo dessa natureza, o que veríamos em cada tela? Veríamos o grande motivo de o Powershell existir: Objetos, objetos e objetos.

O Cmd, como tantos outros, é uma interface de linha de comando baseada em texto e não nos entrega nada além de texto. Nosso amigo Powershell por outro lado, tira proveito do modelo de objetos do .NET e por isso, em vez texto, ele nos entrega objetos.

Não vamos adentrar no assunto de programação orientada à objetos aqui, porém se for do seu interesse, vale muito a pena buscar esse tipo de conhecimento.

Se esse assunto não é familiar para você, apenas tenha em mente que um objeto no Windows Powershell é composto principalmente de duas coisas: Propriedades e Métodos. Propriedades é aquilo que qualifica, caracteriza um objeto. Métodos são ações que o objeto executa ou podemos executar no objeto.

Imagine um carro. Um carro pode ter as propriedades marca, modelo, ano de fabricação, número de chassi, etc. Os métodos poderiam ser ligar, desligar, abastecer, parar, estacionar, e assim por diante.

Quando dissemos que o Cmd nos entrega texto é exatamente isso. Strings, cadeia de caracteres. Como já mencionamos, essa característica não é exclusiva do prompt. Converse com administradores Linux. Um dos motivos dos utilitários grep, sed, awk e companhia fazerem parte do dia a dia desse pessoal é exatamente esse. Manipular output baseado em texto.

O Powershell por sua vez nos entrega objetos. Quando executamos, por exemplo, o cmdlet Get-Service, o que se exibe não é apenas um texto formatado com informações de serviços. O que é exibido na tela são os próprios serviços. Lembra da história do raio-X? Há um fundo de verdade nisso. De fato, podemos ver o que tem por trás do output gerado por um comando executado no powershell.

Get-Member

Você se recorda do que falamos a pouco sobre propriedades e métodos? Pois bem, através do cmdlet Get-Member podemos ver de quais Propriedades e Métodos um objeto é composto, ou seja, podemos conhecer quais são os membros do objeto em questão.

Para ilustrar a representação de objetos vamos tomar como exemplo o Serviço de Transferência Inteligente do Windows – BITS.

Get-Service BITS

Vejamos agora, quem são os membros de um serviço do Windows, ou seja, quais são as propriedades e métodos. Há outros membros além de propriedades e métodos, mas esses dois são os de maior relevância.

Get-Service BITS | Get-Member

Aqui temos algumas informações bem interessantes. Em primeiro lugar tomamos conhecimento que nosso objeto é do tipo ServiceController e possui algumas propriedades e métodos.

Acionando Propriedades

Como você já deve ter notado, propriedade são os nomes das colunas exibidas após a execução do cmdlet. No caso do Get-Service, as colunas (propriedades) mostradas por padrão são Status, Name e DisplayName. Mas, é nesse momento que começamos a usufruir de um shell baseado em objetos. Podemos selecionar as propriedades que desejamos sem precisar manipular texto. Digamos que queremos mostrar as propriedades:

• DisplayName
• CanPauseAndContinue
• CanStop
• Status

Get-Service BITS | Select-Object DisplayName, CanPauseAndContinue, CanStop, Status

É possível também selecionar uma propriedade com o operador “.”

(Get-Service BITS).Status

Acionando métodos

Métodos são ações. Felizmente não precisamos recorrer aos métodos com frequência e há uma razão para isso. Para muitos dos métodos que o objeto possui, pode ser que já exista um outro cmdlet para realizar a ação desejada. Por exemplo, vamos parar o serviço BITS através do método Stop()

(Get-Service BITS).Stop()

Método invocado, serviço parado. Mas como dissemos pode ser que exista um cmdlet equivalente, nesse caso no lugar de invocar o método Stop() poderíamos ter o usado o cmdlet Stop-Service.

Como o serviço foi parado, vamos iniciá-lo novamente, mas em vez de usar o método Start() vamos usar o cmdlet Start-Service.

Start-Service BITS

Ipconfig

Quando iniciamos o artigo, empregamos o utilitário ipconfig para fazer a comparação e depois passamos a utilizar o cmdlet Get-Service. Foi de propósito.

Ao contrário do Get-Service, o ipconfig não é um comando powershell. É um utilitário presente no sistema operacional que podemos executar através da console powershell.exe assim como faríamos com o Cmd ou qualquer outro interpretador de comandos. Enquanto Get-Service é um cmdlet, o ipconfig é classificado como application.

Get-Command ipconfig,Get-Service | ft -AutoSize

Significa dizer que o ipconfig não tem obrigação nenhuma de trazer dados estruturados da mesma forma que o Get-Service. Mas, apesar de não nos apresentar um output que remete à objetos, ainda assim o resultado do ipconfig é um objeto. No caso, um objeto do tipo String.

ipconfig | Get-Member

Sendo um objeto do tipo string, podemos tratá-lo como tal. Strings possuem muitos métodos disponíveis e vamos empregar alguns.

Sem muito esforço podemos passar toda a saída do ipconfig para caixa alta com o método ToUpper():

(ipconfig).ToUpper()

Podemos substituir o nome da interface com o método Replace()

(ipconfig).Replace("INTERNO","DicasDeInfra")

Claro, manipular a saída do ipconfig pode não ser exatamente útil, mas é apenas um exemplo de como podemos usufruir do modelo de objetos do Windows Powershell mesmo quando estamos lidando com outputs não estruturados. Tomamos o ipconfig de exemplo, mas poderia ser qualquer outro utilitário.

Conclusão

A essa altura da leitura você deve estar exausto de ver as palavras: Objetos, Propriedades e Métodos. Mas acredite, ter esse entendimento faz toda a diferença desde a execução de um único cmdlet até o desenvolvimento de scripts e funções complexas.

• É graças ao poder dos objetos que podemos concatenar vários cmdlets numa só linha através do mecanismo de pipeline.
• Todo objeto é de um tipo.
• Alguns métodos já possuem um cmdlet equivalente.
• Nem tudo que se executa no powershell.exe é um comando powershell.
• Faça do Get-Member seu companheiro de trabalho!

Espero que tenha gostado!

Este artigo foi útil?

Para manter um padrão de qualidade para vocês, investimos em um ótimo plano de hospedagem, CDN Pago, Plugins de Otimização para o Site, etc…

Ajude-nos a manter o projeto ativo! 

Acompanhe as novidades em tempo real. Siga nosso perfil no Instagram..

Fernando dos Santos
Analista de Infraestrutura com foco em M365 e Windows Powershell.
pt_BRPortuguese

ATÉ 90% DE DESCONTO

DECOLE SUA CARREIRA!!

Quer dar um upgrade na sua carreira? 

Invista em você e saia na frente! Conquiste aquele emprego dos sonhos em 2022!