PowerShell is a task automation and configuration management framework released by the Microsoft Corporation in 2006. It consists of the PowerShell command-line shell and an associated PowerShell scripting language.
This article refers to the command line interpreter PowerShell, for information about the Scripting Language, please visit the Scripting Category of the lexicon.
In computer science, a shell is the software by which a user interacts with an operating system – a human-machine interface. PowerShell offers SysAdmins and IT professionals the option to automatize, control and regulate tasks or processes of operating processes.
Other known or popular shells to name are Windows Explorer, Microsoft Management Console, Windows control panel, cmd.exe or Bash (Unix). Usually they are differentiated by their appearance, a command-line interface (CLI) is a text-based user interface, whereas a graphical user interface (GUI) allows interaction via a graphical icon or audio.
PowerShell is the main command-line interface for Windows environments. It has been developed with the use of .NET Framework and functions as a Dynamic Link Library (DLL). In order to run it, the use of a host application is mandatory, where runspaces can be defined and sessions run or opened. The user interacts within a command-line interface.
The execution of a PowerShell command works as follows: the host application sends a command to the Windows PowerShell Engine (DLL), where it will be processed and given back to the host application as an object, which will then appear in a text format. By knowing that, it might be unsurprising that the text output may not contain all the information of the former object.
Since the release of PowerShell Core in 2016, based on the .NET Core Common Language Runtime (CoreCLR), PowerShell runs as a cross-platform and open-source project with the MIT-license on Linux, macOS and Windows.
Typical use cases
Use cases for PowerShell can mainly be found in administration, automation and configuration.
PowerShell is usually used by sysadmins to facilitate complex processes or automate reoccurring tasks via scheduled jobs. It also offers power-users a variety of services and automation options.
The main core question one should ask oneself should be: “How often should I perform a certain action?” and “How long does it take me, to do the task manually?”. If the answer to this is something along the lines of “Constantly” and “Very long”, PowerShell might be a good solution for you.
For many automated tasks, PowerShell already offers several types of jobs: background jobs, remote jobs, scheduled jobs and workflow jobs, each with a different feature.
Also, manufacturers like ScriptRunner offers so-called ActionPacks with ready-to-use PowerShell scripts, giving you a head start with the problem of “when to start?”.
The main difference between PowerShell and CMD can be broken down quickly: CMD is a string while PowerShell is object-orientated, both having all characteristics of the given types.
Due to it being built using .NET Framework, PowerShell has direct access to all the .NET libraries, empowering it to call external programs, as opposed to CMD. When an external program is called by CMD, it passes the file name and arguments over to Windows itself via the ShellExecuteEx API call.
The integration of PowerShell can be done at runtime and it is capable of running a bunch of different programs, producing a variety of text objects, CMD only returns text output of the consoles program type. To sum it up, there will be no function existent executed by CMD that PowerShell isn’t capable of.
PowerShell additionally offers a ton of additional features with its cmdlets, pipes and scripts. Before its market launch a sysadmin had to scroll manually through all commands via the GUI without any simple alternative to iterate a certain command without the doubled amount of expense.
PowerShell vs. Bash
Bash was developed as a Linux-Shell for being used in a developer environment, adding and supporting CLI-based interaction. One must distinguish between Bash on Linux and Windows. The following is valid for Bash under Windows.
Bash uses texts as in- and output, making it simple for users to pass information among programs. PowerShell instead uses pipelines of interconnected objects for transferring complex data and whole data structures within a pipeline.
In addition, PowerShell also serves as a perfect tool for configuration under Windows, e.g. changing the registry or managing the Azure Cloud in Exchange. Bash only functions via APIs, which works great for processing text data, but doesn’t facilitate texts as data itself.
On a Linux OS Bash offers a whole ecosystem though, with subshells and login-shells. One can conclude that PowerShell is the main scripting language once one wants to work with a network of Windows systems and Bash under Windows offers a thought-out approach for creating a scripting environment to extend and add Linux-Code, whereas on GNU/Linux systems it is a replacement.
How to check for the PowerShell version
The fail-safe command for finding out which PowerShell version is installed on a system is the following:
Upon not showing a variable one can conclude the engine version is “1.0”.
One common mistake while determining the installed version is using the commands “$Host.Version” and “(Get-Host).Version”. These cmdlets will only reveal the host version, not the engine version.
Overview of PowerShell versions and features
Windows XP SP2, Windows Server 2003 SP1, Windows Vista
Core functions established
Script language existent
cmdlets developed in .NET
Windows Server 2008 R2
Windows XP Service Pack 3
Windows Server 2003 Service Pack 2
Windows Vista Service Pack 1
240 cmdlets and new operators added
With WS-Management scripts and cmdlets can be invoked on remote machine(s),
PSJobs (background jobs) possible
Transactional operations available
Advanced functions (formerly known as: “script cmdlets”)
Modules have been added
Data language changes, featuring help messages for scripts and functions in the user’s UI language (script internationalization)
Script debugging with setable breakpoints
Eventing available, with terminability of managed entities of the user and notification of state changes
PowerShell Integrated Scripting Environment (ISE) introduced and implemented
Network file transfer with native prioritization
New API functions
Windows Server 2012
Windows 7 Service Pack 1
Windows Server 2008 R2 Service Pack 1
Sessions can be disconnected and reconnected
IntelliSense (Code completion) & snippets added
Automatic module detection, inserting a module automatically upon invoking a command from the module
Multiple new commands and modules
Windows Server 2012 R2
Windows 7 SP1
Windows Server 2008 R2
Desired state configuration via WS-Management protocol
New default execution policy: RemoteSigned
Enhanced debugging with debugged workflows, remote script execution and preserving debugging sessions
Windows Management Framework (WMF)
PowerShell class definitions (properties, methods)
PowerShell .NET Enumerations
Debugging for PowerShell Runspaces & Background Jobs
Desired State Configuration (DSC) and Local Configuration Manager (LCM) version 2.0
DSC partial configurations and DSC LCM meta-configurations
Authoring of DSC resources via PowerShell classes
“Desktop/Core” version (Core edition runs on .NET Core and is bundled with Windows Server 2016 Nano Server)
Windows 10 Anniversary Update
Windows Server 2016
Windows Server 2008
Windows Server 2008 R2
Windows Server 2012
Windows Server 2012 R2
Proxies supported with PackageManagement
PSReadLine contains ViMode support
New cmdlets: Get-TimeZone/Set-TimeZone
LocalAccounts module for local user account management
“Desktop” version offers more features, for instance cmdlets for clipboard managing, WMI version 1 cmdlets and event log cmdlets/profiles.
Crossplatform & Windows-independent
Free & open source
Major change: platform expansion and open-source
Support for latest Windows, macOS and Linux versions
Increased cmdlet compatibility
Based on .NET Core 2.1
Minor cmdlet/language enhancements
Based on .NET Core 3.1
Available across Windows, Linux and MacOS platforms
Works not only locally, but also in the cloud and in hybrid infrastructures
Intended as a replacement for Core 6.x products and Windows PowerShell 5.1
SSH as new network protocol for PowerShell remoting
New ternary operator “a ? b : c” for formulating “if–else”- statements
New pipeline chain operators “&&” and “||” for linking multiple pipelines conditionally
New NULL Condition Operators “??” and “??=” for performing conditional queries
New feature “ForEach-Object -Parallel” for the parallel processing of objects in a pipeline
New option “ConciseView” and “Get-Error” Cmdlet for improved error handling
For a detailed overview of what’s new in PowerShell version 7, we suggest you read the article Welcome to PowerShell 7 on the ScriptRunner Blog.
PowerShell is pre-installed on Windows, so one might want to check the table above for the version that Windows has already come with.
Microsoft completely reshaped its former Windows-exclusive management framework tool to serve on a broad range of operating systems
The recommended way to find supported platforms or versions is the official GitHub PowerShell Repository, even including installing instructions or find PowerShell versions for community-supported platforms only.