PowerShell vs CMD: Unlocking the Power of Windows

We explore the power of Powershell and why it's a worthy successor to the command line crown

Windows PowerShell is a Windows command-line shell designed especially for system administrators. The tool, which is built on the .NET framework and enables admins to automate system task and to create system management tools for commonly implemented processes, goes far beyond Microsoft's previous command-line interfaces (CLIs).

Microsoft's CLIs began with command.com, which was the interpreter for MS-DOS and the shell in Windows 9x systems. Microsoft superseded this in NT with CMD.exe, which added goodies like better error messages, command line completion, and native access to the command history.

Command.com remained the Windows CLI du jour until 2006 when Microsoft first debuted PowerShell.

Advertisement - Article continues below

PowerShell began as a project called the Microsoft Shell (AKA Monad) in 2002, but it wasn't until 2006 that the company renamed it and integrated it into Windows 7. Since then, PowerShell has been an integrated component in the Windows OS. Although CMD.exe coexists with PowerShell, its influence is gradually eroding. Microsoft officially replaced it with PowerShell as the default command shell accessible from File Explorer in November 2017.

So why the shift to PowerShell?

CMD.exe was a limited tool. You could use it to run basic administrative commands on a machine, but you couldn't manage 400 at once, nor could you manage things remotely, such as virtual servers in the cloud. 

Advertisement - Article continues below

Though CMD.exe doesn't do those things, PowerShell supports add-on functionality to manage machines in Microsoft's Azure cloud, such as creating, controlling, and monitoring virtual machines, and configuring cloud storage.

Jeffrey Snover, the head of the PowerShell project team, designed the tool as the missing link between Microsoft's GUI-based administrative tools and the rich set of application programming interfaces (APIs) that expose the company's .NET framework.

Advertisement - Article continues below

He wanted a single command-line tool to support both developers and administrators. In this sense, PowerShell was one of the first forays into what became DevOps, a practice that promotes collaboration between developers and operations teams.

What can PowerShell do? 

Unlike CMD.exe, PowerShell is an object-oriented tool. Objects are representations of things like files and directories that have their own properties and actions that you can call upon in the CLI. PowerShell understands everything in Windows as an object, but also lets you create your own object types.

PowerShell enables admins to get at these objects using more sophisticated commands than you'll find in CMD.exe. One of the tool's key innovations is its use of commandlets (CMDlets). These are small programs (as little as a dozen lines of code) that can carry out specific tasks using .NET's APIs. They can execute an object's methods, query and change its attributes, and return objects as their results.

Advertisement - Article continues below

CMDlets come in a simple verb-noun form and enable you to get things done quickly. For example, typing Get-Member gives you information about an object, like its properties or attributes.

Get-Member won't do much on its own, though. You need a pipeline - which is another thing that wasn't available in CMD.exe. Unix and Linux users have enjoyed pipelines for decades, and it's just one command that PowerShell supports from the Bash shell that's common to those systems.

A pipeline lets you take the output of one command and 'pipe' it to another, which takes it as input. You depict a pipeline using |. Say you want to create an object in PowerShell:

Advertisement - Article continues below

$message = Write-Output 'PowerShell is awesome'

You've just used the Write-Output CMDlet to assign some text to what many languages would call a variable. Except in PowerShell, it's not a variable; it's an object with its own methods and properties. You can list them all by piping the $message object to Get-Member:`$message | Get-Member'

Advertisement - Article continues below

You can pipe lots of CMDlets together to create extensive chains of commands, like a conveyor belt of workers adapting something and passing it on to the next person.

Piping aside, this kind of object-oriented programming will be familiar to developers who work in languages like Python. You can even make the object give up certain information about itself using the object's name, a dot, and the property name. For example:$message.Length returns 21

You can create CMDlets yourself in a variety of languages, like Microsoft's own C#. An alternative approach to creating your own PowerShell programs is to write scripts, which are collections of PowerShell commands collected together into a file that you can run. Although cmd.exe also allows scripts, PowerShell provides its own interactive scripting environment (PowerShell ISE) with a range of extra features like Intellisense, which gives you context-aware method and property options as you're typing.

There's another thing PowerShell gives you that cmd.exe doesn't: the ability to create modules. These are packages of related scripts and/or CMDlets that call upon each other to help carry out a bigger task. You can share lots of complementary scripts and CMDlets far more easily as a module. Sharing is a big part of the PowerShell story. For example, there's a PowerShell gallery containing thousands of scripts and modules from developers.

PowerShell keeps evolving

In 2016, Microsoft open-sourced it as PowerShell Core, and it's now available on Linux and Mac computers as an alternative to the common Bash shell. Be warned, though; installing it on those machines means forklifting .NET Core, the pared-down open source counterpart to native Windows .NET, onto your system. You'll also lose functionality (it doesn't support the ISE scripting environment, for example).

Advertisement - Article continues below

PowerShell has expanded over the years, with new facilities including classes (objects that you can use as templates for other objects), and integration with tools like Visual Studio Code (available in both PowerShell and PowerShell Core).

Should you use PowerShell? The learning curve isn't as steep as you'd think, and the features it brings you are worthwhile. You might not need them all if you're just tinkering with your own machine, but isn't it better to have a powerful toolbox with some tools you won't use, rather than relying on a 20-year-old set of pliers?

Featured Resources

The case for a marketing content hub

Transform your digital marketing to deliver customer expectations

Download now

Fast, flexible and compliant e-signatures for global businesses

Be at the forefront of digital transformation with electronic signatures

Download now

Why CEOS should care about the move to SAP S/4HANA

And how they can accelerate business value

Download now

IT faces new security challenges in the wake of COVID-19

Beat the crisis by learning how to secure your network

Download now

Most Popular

Microsoft Windows

Microsoft's latest Windows 10 update is causing yet more issues

26 May 2020

Nokia breaks 5G record with speeds nearing 5Gbps

20 May 2020
data breaches

EasyJet faces class-action lawsuit over data breach

26 May 2020