PowerShell is an object-based shell. Imagine a Unix shell (bash, Korn shell, etc.) that passes around .NET objects.

In many ways, PowerShell is a best-of-both-worlds synthesis of Windows and Unix culture. It was developed at Microsoft by former Unix developers. The core of the PowerShell language is based on the IEEE POSIX 1003.2 standard for Unix shells. But where Unix shells pipe text between commands, PowerShell passes .NET objects. That means instead of having to tease apart text to extract the information you want, you can simply access methods and properties of objects. It takes a while to realize just how powerful this is.

Because PowerShell is built on .NET, you can access the full functionality of the .NET framework from PowerShell just as you would from C# or VB.NET. But in addition, PowerShell wraps previous Microsoft object models such as COM and WMI in a consistent way so you can mix these objects together without paying a great deal of attention to where the objects originated.

PowerShell is duct tape extraordinaire. It does an awful lot of work behind the scenes to make various pieces fit together seamlessly. If you were to rewrite a typical PowerShell script in C#, for example, you'd realize how much tedious munging PowerShell is doing for you.

PowerShell is extremely consistent. For example, the basic building blocks of functionality, called "cmdlets", follow a strict verb-dash-noun naming convention: get-member, stop-process, format-table, etc. As another example, PowerShell collections simply have a length property. You don't have to remember whether particular objects use length, size, or count to say how big they are.

PowerShell provides aliases to help people coming from DOS or Unix get started. For example, you can list the files in a directory with dir or ls. Both are aliases for the get-childitem cmdlet. (Why such an awkward name as "get-childitem"? It goes back to consistency. The get-childitem cmdlet is used for navigating every hierarchical collection, whether it's the file system, the Windows registry, etc.)

PowerShell is both a shell and a programming language. As Joel Bennett put it, some people see PowerShell as bash for .NET and others see it as Perl for .NET. These correspond roughly to the system administrator and programmer perspectives. While PowerShell is a powerful scripting language, it helps to remember that it's first of all a shell. That helps explain some language design decisions that would seem mysterious otherwise. For example, why on earth does PowerShell use -lt and -gt instead of the symbols < and > to compare two numbers? Because both Windows and Unix tradition dictates that < and > are used in shells as redirection operators.

Although PowerShell is a Microsoft project, there is an open source counterpart Pash to make cross platform version by building on top of Mono.


To learn more about PowerShell, pick your media.

Book Windows PowerShell in Action
Booklet PowerShell Day 1
Community PowerShellCommunity.org
Podcast PowerScripting podcast
Newsgroup     Windows PowerShell newsgroup
Video Windows PowerShell: Origin and Future