PowerShell — Trivia & Interesting Facts¶
Surprising, historical, and little-known facts about PowerShell.
PowerShell was originally called "Monad" and was almost killed by Microsoft¶
Jeffrey Snover began designing Monad in 2002 at Microsoft. The project nearly died multiple times because Microsoft's management did not see why Windows needed a command-line shell. Snover has described having to repeatedly justify the project's existence. Monad was renamed PowerShell in 2006 and first released with Windows Vista. Snover received a Technical Fellow title — Microsoft's highest engineering honor.
PowerShell passes objects, not text — and this was revolutionary¶
Unix pipes pass text strings between commands; PowerShell pipes pass .NET objects with properties and methods. Get-Process | Where-Object CPU -gt 100 | Sort-Object WorkingSet operates on structured Process objects, not parsed text. This eliminated the fragile text-parsing step (grep, awk, cut) that makes Unix pipelines brittle. Snover called this "the most important design decision in PowerShell."
PowerShell is open source and runs on Linux and macOS¶
In August 2016, Microsoft open-sourced PowerShell (as PowerShell Core 6.0) and released it for Linux and macOS. This was part of Satya Nadella's "Microsoft loves Linux" strategy. PowerShell 7.x runs natively on Ubuntu, RHEL, Alpine, and macOS. You can install it via apt, yum, or brew. Some Linux automation teams use PowerShell for cross-platform scripts that also target Windows.
The Verb-Noun naming convention is enforced by design¶
Every PowerShell cmdlet follows the Verb-Noun pattern: Get-Process, Set-Content, Remove-Item. Microsoft maintains an approved verb list (about 100 verbs). This rigid naming means you can guess command names: if you know Get-Service, you can infer Stop-Service, Start-Service, and Restart-Service. No other shell has ever enforced naming conventions this strictly.
PowerShell aliases mimic Unix commands — intentionally¶
ls in PowerShell runs Get-ChildItem. cat runs Get-Content. cd runs Set-Location. rm runs Remove-Item. These aliases were deliberately added so Unix users could start using PowerShell with familiar commands. However, the behavior is not identical — ls in PowerShell returns objects with methods, not text lines, which surprises users who pipe to grep.
The PowerShell Gallery has over 12,000 modules¶
The PowerShell Gallery (launched 2015) is PowerShell's equivalent of PyPI or npm. It hosts over 12,000 modules covering Azure management, Active Directory, VMware, AWS, Exchange, and more. Install-Module Az installs the entire Azure management toolkit. The Gallery uses NuGet infrastructure, the same system that powers .NET package management.
PowerShell Desired State Configuration predated Ansible's popularity¶
PowerShell DSC (2014) allows declaring the desired state of a Windows system (installed features, registry values, file contents, services) and letting PowerShell enforce it. DSC was a Windows-native configuration management tool years before most Windows shops adopted Ansible. DSC v3 (in development) is being rewritten as a cross-platform tool.
PowerShell's pipeline processes objects one at a time¶
PowerShell's pipeline streams objects individually through each command — it does not collect all output before passing it. Get-Content largefile.log | Select-String "error" starts matching immediately, even on multi-gigabyte files. This streaming behavior means memory usage stays constant regardless of input size, a property shared with Unix pipes but achieved through object streaming rather than byte streaming.
Remoting uses WinRM by default but supports SSH¶
PowerShell remoting (Enter-PSSession, Invoke-Command) originally used WS-Management (WinRM) over HTTP/HTTPS. PowerShell 6+ added SSH as a transport option, enabling remoting to Linux hosts. Invoke-Command -HostName linuxserver -ScriptBlock { Get-Process } runs PowerShell on a remote Linux machine over SSH and returns .NET objects.
PowerShell profiles are the equivalent of .bashrc¶
PowerShell loads profile scripts on startup: $PROFILE points to the current user's profile (typically ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on Linux). Like .bashrc, this is where you put aliases, functions, and module imports. The $PROFILE variable actually has four variants for different scopes: CurrentUserCurrentHost, CurrentUserAllHosts, AllUsersCurrentHost, and AllUsersAllHosts.
Jeffrey Snover's "Monad Manifesto" is worth reading¶
Snover's 2002 white paper "The Monad Manifesto" laid out the entire philosophy of PowerShell before a single line of code was written. It argued that GUIs are great for simple tasks but terrible for automation, that structured data should replace text parsing, and that administrators need a composable command system. The manifesto is publicly available and reads as prescient 20+ years later.