Comparando para entender a diferença entre o PowerShell e o cmd [com diagramas]
Quando se pensa no "ecrã preto" do Windows, muitas pessoas podem imaginar a antiga "Linha de Comandos (cmd.exe)". No entanto, o que temos vindo a aprender nos artigos até agora foi o "PowerShell", mais moderno e potente, caracterizado pelo seu fundo azul. Estes dois, embora parecidos, são na verdade completamente diferentes.
Muitos de vós devem ter dúvidas como: "Porque existem dois tipos?", "Qual devo usar no final?", "O cmd já está obsoleto?". Neste artigo, vamos comparar estes eternos rivais (?), o PowerShell e a Linha de Comandos, com tarefas concretas, explicando as suas diferenças de uma forma que até os iniciantes conseguem entender.
Quando terminar de ler este artigo, deverá ter uma compreensão clara das suas vantagens esmagadoras e do porquê de dever escolher o PowerShell. Vamos ver com os nossos próprios olhos a diferença entre a Linha de Comandos, que é um "martelo", e o PowerShell, que é uma "ferramenta elétrica multifunções"!
A maior e decisiva diferença: "Objetos" vs. "Texto"
A diferença mais fundamental entre o PowerShell e o cmd é o formato da informação que os comandos devolvem. Compreender isto é a chave para entender a diferença entre os dois.
O mundo da Linha de Comandos (cmd): tudo é "texto"
Quando se digita um comando como dir na Linha de Comandos, o que aparece no ecrã é apenas "texto (uma cadeia de caracteres)" formatado para leitura humana. É como uma lista impressa em papel. É muito entediante e requer um processamento de cadeias de caracteres complexo para extrair apenas o "nome do ficheiro" ou a "data de modificação" desta lista para usar no processo seguinte.
C:\> dir
O volume na unidade C é o Windows
O Número de Série do Volume é XXXX-XXXX
Diretório de C:\
07/07/2024 09:00 Program Files
07/07/2024 09:05 Users
07/07/2024 09:10 Windows
0 Ficheiro(s) 0 bytes
3 Pasta(s) 123.456.789.012 bytes livres
Este resultado é apenas uma "sequência de caracteres" e, para um programa, são dados sem estrutura.
O mundo do PowerShell: tudo são "objetos"
Por outro lado, quando executa um comando semelhante, Get-ChildItem, no PowerShell, o que é devolvido é uma coleção de "objetos" estruturados. Um objeto é um bloco de dados que contém várias informações (propriedades).
【Diagrama conceptual】Um dos "objetos de ficheiro" que o Get-ChildItem devolve contém a seguinte informação armazenada de forma ordenada:
Name: "Program Files" (Nome)Length: (Tamanho)CreationTime: "2024/07/07 9:00:00" (Data de criação)LastWriteTime: "2024/07/07 9:02:10" (Última data de escrita)Mode: "d-----" (Atributo)
Isto é como uma tabela de Excel com a informação organizada. Graças a esta estrutura, o PowerShell torna surpreendentemente fácil realizar operações flexíveis baseadas em dados, como "ordenar por tamanho em ordem decrescente" ou "exibir apenas ficheiros com a extensão .txt".
PS C:\> Get-ChildItem
Diretório: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 07/07/2024 09:00 Program Files
d----- 07/07/2024 09:05 Users
d----- 07/07/2024 09:10 Windows
Embora pareçam semelhantes, o ponto mais importante é que a qualidade dos dados que estão a ser manuseados nos bastidores é completamente diferente.
Comparação prática: vamos comparar com uma tarefa específica
Vamos comparar os dois com uma tarefa um pouco complexa: "Da lista de serviços atualmente em execução, exibir apenas os que têm 'Windows' no nome, ordenados por nome."
O desafio na Linha de Comandos (cmd)
Tentar alcançar isto no cmd é muito difícil. Pode obter uma lista de serviços com net start, mas o resultado é apenas texto. Extrair as linhas que contêm uma palavra específica e depois ordená-las exigiria o uso de findstr, sort, e um complexo loop for, o que é quase impossível para um iniciante.
C:\> net start
Os seguintes serviços do Windows foram iniciados:
Application Host Helper Service
Background Tasks Infrastructure Service
Base Filtering Engine
...
Windows Audio
Windows Connection Manager
Windows Defender Antivirus Service
...
Extrair com precisão apenas a informação desejada desta parede de texto é uma tarefa formidável.
A solução elegante no PowerShell
No PowerShell, graças aos objetos e ao pipeline, pode escrever este processo de forma intuitiva numa única linha.
Get-Service | Where-Object { $_.DisplayName -like "*Windows*" } | Sort-Object -Property DisplayName
Esta única linha realiza os seguintes passos em sequência:
Get-Service: Obtém todos os serviços como "objetos".|: Passa a coleção de objetos para o comando seguinte.Where-Object ...: Dos objetos passados, filtra apenas aqueles cuja propriedade DisplayName contém "Windows".|: Passa os resultados filtrados para o comando seguinte.Sort-Object ...: Ordena os objetos passados pela sua propriedade DisplayName.
Esta comparação deve ter-lhe dado uma noção real da superioridade do PowerShell no processamento de dados e das suas vantagens.
Diferenças em comandos e sintaxe
Para compatibilidade com o cmd, o PowerShell permite-lhe usar alguns comandos antigos como "aliases" (nomes alternativos). No entanto, os seus cmdlets e sintaxe nativos são projetados para serem mais modernos e consistentes.
Manuseamento de variáveis
cmd: set nome_variavel=valor
set MYVAR=Hello World
PowerShell: $nome_variavel = valor
$myVar = "Hello World"
No PowerShell, a regra é prefixar os nomes das variáveis com um $.
Ramificação condicional (instrução if)
cmd:
if "%MYVAR%"=="Hello World" (echo Same)
PowerShell:
if ($myVar -eq "Hello World") { Write-Host "Same" }
O PowerShell usa operadores de comparação mais intuitivos como -eq (equal) e -gt (greater than).
O cmd já é desnecessário? O futuro do shell do Windows
Pode perguntar-se: "Se o PowerShell é tão conveniente, a Linha de Comandos já não é necessária?". A resposta é: "Não, não desaparecerá em breve. No entanto, deve fazer tudo o que é novo no PowerShell."
A Linha de Comandos ainda está incluída no Windows para manter a compatibilidade com sistemas muito antigos e com o vasto número de ficheiros batch (.bat) criados no passado. É pouco provável que a Microsoft a descontinue completamente.
No entanto, como se pode ver pelo facto de o PowerShell ser a configuração padrão na ferramenta de terminal padrão do Windows, o "Windows Terminal", não há dúvida de que a Microsoft posicionou o PowerShell como o centro da futura administração e automação do Windows.
Se está a aprender a linha de comandos do zero, escolher o PowerShell é, sem dúvida, a escolha mais sensata.
Conclusão
Desta vez, comparámos as diferenças decisivas entre o PowerShell e a Linha de Comandos (cmd), com a ajuda de diagramas (conceptuais).
- A maior diferença é a filosofia de design fundamental: o cmd manuseia texto, enquanto o PowerShell manuseia objetos.
- O PowerShell permite um processamento de dados flexível e potente ao encadear objetos com o pipeline.
- A convenção de nomenclatura de comandos (
Verbo-Substantivo) e a sintaxe também são mais consistentes e modernas no PowerShell. - Embora o cmd não vá desaparecer em breve, no futuro do Windows, o PowerShell é o protagonista.
Agora, quando se deparar com o ecrã preto do Windows, deverá ter uma razão clara para escolher a "ferramenta multifunções" que é o PowerShell. A nossa série de introdução ao PowerShell termina aqui, mas a sua jornada para a automação apenas começou. Incentivamo-lo a incorporar o PowerShell nas suas tarefas diárias e a sentir o seu poder por si mesmo!