Windows PowerShell （コードネーム：Monad）は、コマンドライン駆動のインターフェース（CLI）です。古いバージョンのWindows Vistaには付属していませんが、Windows XP、Windows 2003 Server、Windows Vistaでは関係なく使用することができました。
Windows PowerShellは、Exchange Server 2007、System Center Virtual Machine Manager 2007、System Center Operations Manager 2007の管理ツールの基盤となっており、すべての操作をコマンドラインインターフェイスで行い、その上に管理用のGUIを重ねています。
Windows PowerShellは、地球全体がモナドと呼ばれる互いに接続されていない形而上学的な構造で構成されているという「モナドロジー」と呼ばれるシステムに基づいて動作します。Windows PowerShellの「モナド」は「コマンドレット」と呼ばれるオブジェクトです。Windows Script Hostの失敗を受けて、マイクロソフト社は2003年にはWindows PowerShellの開発に着手しました。Windows Script Hostとは異なり、Windows PowerShellはシェルと直接対話し、高い安全性を備えています。
Windows Powershellは、パイプを使ったり、データをストリームしたりして通信するサービスではなく、異なるリモートマシンにある2つのコマンドレット間でオブジェクト間通信を行います。プロセスのリストは、プロセスを説明するテキストではなく、プロセスを表すオブジェクトで構成され、外部の構造体やライブラリを明示的に参照することなく、それらのオブジェクトに対してメソッドを呼び出すことができます。
Windows PowerShellはホスティングアプリケーション（デフォルトはpowershell.exe）の中で動作し、ユーザーにコマンドラインを公開し、コマンドラインから呼び出されるコマンドとの通信にホストインターフェースを使用します。ホスティングアプリケーションには、コンソールアプリケーション、Windowsアプリケーション、またはWebアプリケーションがあります。ほとんどの場合、ホスティングアプリケーションは、その「Main」関数を使用して、内部ホストインターフェースを介してWindows PowerShellランタイムと対話します。しかし、ホスティングアプリケーションは、オプションとして、PSHostクラスと1つ以上の関連するユーザーインターフェースクラスを実装することで、独自のカスタムホストをサポートすることができます。これらのクラスを併用することで、アプリケーションとWindows PowerShellコマンドの間の直接通信が可能になります。
ホスティング・アプリケーションがWindows PowerShellランタイムと通信する際に最初にしなければならないことは、ユーザー・セッションを簡略化するために使用されるWindows PowerShellランタイムの抽象化であるランスペース( ''Runspace'' )を作成することです。これを行うために、ホスティングアプリケーションは、RunspaceFactoryクラスのCreateRunspaceメソッドを呼び出します。ランスペース自体は、Runspaceオブジェクトで表されます。さらに、Windows PowerShellは、ランスペースの構成を定義するためにRunspaceConfigurationクラスを提供します。構成情報には、ホストアプリケーションがサポートするコマンドやWindows PowerShellプロバイダに関するデータ、およびランスペースのスタートアップスクリプトが含まれます。ユーザースクリプトは、ランスペースの構成には反映されません。ランスペースが作成されると、対応するセッションが自動的に開かれ、その状態はSessionStateオブジェクトで表されます。セッションの状態データには、Windows PowerShellのパス、Windows PowerShellのドライブ、Windows PowerShellのプロバイダ、およびセッション中にアクティブなコマンドレットやその他のコマンドに関する情報が含まれます。
ホストアプリケーションがランスペースを作成したら、必要なセッションの種類に合わせてランスペースを開く必要があります。同期I/Oを使用するセッションの場合、アプリケーションはOpenメソッドを呼び出します。アプリケーションが非同期I/Oを使用し、ランスペースが読み取り/書き込み要求を満たす間に他の操作を行う必要がある場合は、OpenAsyncメソッドを呼び出すことができます。OpenAsync を呼び出す場合、カスタム・ホストを定義しているホスト・アプリケーションは、I/O 通知を受け取るための適切なコールバック・メソッドをサポートする必要があります。
ランスペースがオープンされると、「コマンドの処理」で説明したように、ホスティングアプリケーションはランスペースでパイプラインを作成して起動することで、セッションを操作できます。
ランスペースでは、SessionStateProxyオブジェクトのGetVariableおよびSetVariableメソッドを呼び出すことで、ホスティング・アプリケーションがセッションを操作することができます。
ホスト・アプリケーションがユーザからのコマンド・シーケンスを蓄積した場合、そのコマンドを1つまたは複数のパイプラインにまとめる必要があります。
コマンド・シーケンスは、セミコロン(;)で区切られた複数のネストされたパイプラインから構成されます。以下にその例を示します。
 PS C:\Users\User1> pqr | bar; a | b 
Windows PowerShellのランタイムは、このシーケンスを、pqr｜barとa｜bという2つのネストしたパイプラインを持つ1つのパイプラインとして表現します。
独自のパイプラインを作成するために、ホスティングアプリケーションはCreatePipelineメソッドまたはCreateNestedPipelineメソッドを呼び出します。空のパイプラインを作成する場合や、パイプラインを作成してコマンドを入力する必要がある場合、アプリケーションはCreatePipelineを呼び出します。現在のパイプラインが実行されているランスペースにパイプラインを作成する必要がある場合、アプリケーションはCreateNestedPipelineを呼び出す必要があります。
パイプラインが設定されたので、ホスト・アプリケーションはその動作を開始する必要があります。アプリケーションが同期I/Oを使用している場合、Invokeメソッドを呼び出し、空のパイプラインまたは入力されたパイプラインのいずれかのバリアントを使用します。非同期I/Oの場合、アプリケーションは代わりにInvokeAsyncを呼び出すことができます。
最初のバージョンには、以下の機能が含まれています。
C#ライクなスクリプト言語で、ハッシュテーブル、正規表現をテストできるswitch文、配列のスライス、データとして保存して後で実行できる匿名メソッド（スクリプトブロック）をサポートしています。また、ループ(for/foreach/while)、条件文(if/switch)、変数のスコープ(global/script/local)、関数を定義する機能も備えています。
Cmdlets は特定のオプションを継承しており、ユーザーはインタラクションのレベルやエラーへの対処方法などを選択できます。副作用を発生させる Cmdlets は、オプション -WhatIf と -Confirm をサポートしています。-WhatIfは、起こったであろうことをユーザに知らせますが、アクションは起こりません。-Confirmは、何が起ころうとしているのかをユーザに知らせ、ユーザがそれを実行するかどうかをコントロールできるようにします。
エラーに対処するための1つのオプションは、ユーザーが新しいコマンドシェルに入り、問題を調査した後、元のコマンドを再開することができる「サスペンド」機能を呼び出すことです。ユーザーはこのような状況で表示されるプロンプトを定義することができます。
拡張可能な''プロバイダー''モデルにより、ファイルシステムやその他の階層的なデータストアへのアクセスや操作が可能です。いくつか例を挙げます。PowerShell には、「HKLM」および「HKCU」ハイブを介したレジストリへのアクセスを可能にするレジストリプロバイダが付属しています。これにより、シェルプロンプトで「dir HKLM:\SOFTWARE\Microsoft」などのコマンドを実行することで、レジストリを参照することができます。PowerShell には、証明書ストア、環境、シェル関数およびエイリアス用のプロバイダが付属しています。コマンドレットと同様に、プロバイダモデルは拡張可能であり、サードパーティが独自のプロバイダモデルを作成し、PowerShellにプラグインすることができます。
PowerShell スクリプトの実行時に粗いセキュリティ制約を課すことができる「実行ポリシー」と呼ばれる概念です。実行ポリシーは、PowerShellが設定ファイルをロードし、スクリプトを実行する際の制限を定義します。実行ポリシーには、「Restricted」、「AllSigned」、「RemoteSigned」、「Unrestricted」の4種類があります。
スクリプトの発行者の身元を確認し、デジタル署名を使用して発行されたスクリプトの整合性を検証するスクリプト署名の使用をサポートします。
コマンドラインオプションは、基本的には単語全体ですが、曖昧さをなくすために必要最小限の文字数で指定することができます。例えば、-show-detailed-informationというオプションは、他に's'で始まるオプションがなければ、-sと入力することができます。
包括的でユーザーが拡張可能なタブ補完機能。現行バージョンの Windows の cmd.exe シェルは、Bash や zsh などのシェルの高度な補完機能とは対照的に、ファイル名やディレクトリ名しか補完できません。
コマンドの出力を変数に代入することができ、変数は任意の方法で検査可能なオブジェクトまたはオブジェクトの配列になります。