PowerShell
Microsoft's object-oriented command shell and scripting language, built on .NET, whose pipeline passes structured objects instead of plain text.
Created by Jeffrey Snover, Bruce Payette, and James Truher (Microsoft)
PowerShell is Microsoft’s command-line shell and scripting language, built on .NET, whose defining idea is an object pipeline: instead of passing plain text between commands the way traditional Unix shells do, PowerShell passes structured .NET objects. This single design decision reshapes how automation works — a command’s output is a rich object with named properties and methods, not a block of text that the next command must parse. First released as Windows PowerShell 1.0 on November 14, 2006, it has grown from a Windows-only administration tool into a cross-platform, open-source language that runs on Windows, macOS, and Linux.
History and Origins
PowerShell began as a research effort led by Jeffrey Snover, who in 2002 circulated a white paper now known as the “Monad Manifesto.” Snover’s argument was that Windows administration suffered because its shells were built around text. Unix tools could be composed because they shared a lingua franca of text streams, but Windows configuration lived in structured stores like the registry, WMI, and the .NET object model — places where text-parsing pipelines fit poorly. His proposed answer, codenamed Monad, was a shell whose pipeline carried objects rather than bytes.
Monad was first shown publicly at Microsoft’s Professional Developers Conference in 2003, moved through private beta, and reached public beta in 2005. In April 2006 Microsoft renamed the project Windows PowerShell, and version 1.0 shipped on November 14, 2006, supporting Windows XP SP2, Windows Server 2003, and Windows Vista, with roughly 130 cmdlets out of the box. The language was designed by Snover together with Bruce Payette and James Truher, among others.
Design Philosophy
PowerShell’s philosophy can be summarized in a few connected ideas:
- Objects, not text. The pipeline passes live .NET objects, so a command like
Get-Processyields process objects you can filter, sort, and inspect by property — without writing fragile string-parsing code. - Discoverability. Commands follow a strict
Verb-Nounnaming convention (Get-Item,Set-Location,Stop-Service), and the approved-verb list keeps that vocabulary consistent. Built-in cmdlets likeGet-Command,Get-Help, andGet-Memberlet users explore what is available and what an object exposes. - Consistency. Cmdlets share common parameter conventions (such as
-WhatIf,-Confirm, and-ErrorAction), so once you learn the patterns they apply broadly across the ecosystem. - Administration first, but a real language. PowerShell is built for operators automating systems, yet it is also a full scripting language with functions, modules, error handling, and classes.
Key Features
- The object pipeline — the central feature.
Get-ChildItem | Where-Object Length -gt 1MB | Sort-Object Lengthfilters and sorts file objects by their real properties, no text parsing required. - Cmdlets and modules — compiled or script-based commands, packaged into modules that can be discovered and installed (the PowerShell Gallery is the central repository).
- Deep .NET integration — any .NET type can be used directly, so scripts can reach into the full framework when cmdlets are not enough.
- Remoting — built-in remote execution (introduced in 2.0) lets a single session manage many machines.
- Desired State Configuration (DSC) — a declarative model, added in 4.0, for describing and enforcing system configuration.
- Cross-platform shell (
pwsh) — since the move to .NET Core, the executablepwshruns the same scripting language on Windows, macOS, and Linux.
A short example shows the Verb-Noun style and the object pipeline at work:
| |
Each stage receives real process objects — $_.WorkingSet reads a property, not a parsed column of text.
Evolution
PowerShell’s history splits into two broad eras.
Windows PowerShell (1.0–5.1). This Windows-only line, built on the full .NET Framework, grew steadily: 2.0 (2009) added remoting, modules, and the ISE; 3.0 (2012) and 4.0 (2013) refined the language and introduced DSC; 5.0 and 5.1 (2016) added classes and package management. Version 5.1 is the final release of this line and still ships in-box with Windows.
Open-source, cross-platform PowerShell (6.0 onward). On August 18, 2016, Microsoft open-sourced PowerShell under the MIT License and rebuilt it on .NET Core, making it genuinely cross-platform. PowerShell Core 6.0 arrived on January 10, 2018. With PowerShell 7.0 (March 4, 2020) Microsoft dropped the “Core” label, signaling that the pwsh-based, cross-platform edition was now the primary version. The 7.x series has continued on a regular cadence, with PowerShell 7.5 reaching general availability in January 2025 atop .NET 9, followed by PowerShell 7.6 — a Long-Term Support release built on .NET 10 — on March 18, 2026.
| Era | Versions | Runtime | Platforms |
|---|---|---|---|
| Windows PowerShell | 1.0 – 5.1 | .NET Framework | Windows only |
| PowerShell Core | 6.0 – 6.2 | .NET Core | Windows, macOS, Linux |
| PowerShell | 7.0+ | .NET (Core 3.1 / .NET 5+) | Windows, macOS, Linux |
Current Relevance
PowerShell is one of the most widely used automation languages in enterprise computing. It remains the default tool for Windows administration, the backbone of Azure cloud management through the Az module, and a common scripting layer in DevOps pipelines on every major platform. Its development happens in the open on GitHub, with regular releases distributed through package managers, the PowerShell Gallery for modules, and official Docker images. The shift to cross-platform .NET means PowerShell is no longer a Windows-only curiosity but a portable scripting option that Linux and macOS users can adopt as well.
Why It Matters
PowerShell’s lasting contribution is the object pipeline. For decades, shell scripting meant composing programs through text — powerful, but brittle, since each tool had to print parseable output and each script had to parse it correctly. PowerShell asked what a shell would look like if its pipeline carried structured data instead, and the answer influenced how a generation of administrators think about automation. That idea has since echoed in newer shells like Nushell, which also build pipelines around structured data rather than raw text. By marrying a discoverable, consistent command model to the full power of .NET, PowerShell turned shell scripting on Windows from an afterthought into a first-class engineering discipline — and then carried that model to the rest of the computing world.
Timeline
Notable Uses & Legacy
Windows system administration
PowerShell is the primary automation and configuration tool for Windows administrators, used to manage users, services, the registry, event logs, and the file system, and to script repetitive operational tasks across fleets of machines.
Microsoft Azure (Az module)
The Azure PowerShell "Az" module lets engineers provision and manage cloud resources — virtual machines, storage, networking, and more — through cmdlets, often as part of infrastructure-as-code and deployment automation.
Microsoft 365, Exchange, and Active Directory
Administrators rely on dedicated PowerShell modules to manage Exchange mailboxes, Microsoft 365 tenants, and Active Directory identities at scale, where the GUI alternatives would be slow or impractical.
DevOps and CI/CD pipelines
Because PowerShell runs cross-platform and integrates with .NET, it is widely used as a scripting glue in build and release pipelines (for example in Azure DevOps and GitHub Actions) for build, test, and deployment steps.
Package management with Chocolatey
Chocolatey, a popular Windows package manager, is built around PowerShell, using it to define and run install, upgrade, and uninstall scripts for thousands of software packages.
Language Influence
Influenced By
Influenced
Running Today
Run examples using the official Docker image:
docker pull mcr.microsoft.com/powershell:latestExample usage:
docker run --rm mcr.microsoft.com/powershell:latest pwsh -c "Write-Output 'Hello, World!'"