PowerShellは、タスクの自動化と構成管理のためにMicrosoftが開発したシェルプログラムです。シェルとして一般的な機能として、対話型での使用を目的としたコマンドラインインタープリターと、専用の言語による自動化を目的としたスクリプトインタープリターを提供しています。当初はWindows専用としてWindows PowerShellとして知られていましたが、2016年8月18日にPowerShell Coreの導入によりオープンソース化され、クロスプラットフォーム化されました。[ 6 ]前者は.NET Framework上に、後者は.NET(旧称.NET Core)上に構築されています。
PowerShellは現在のバージョンのWindowsにバンドルされており、 macOSとLinuxにインストールできます。[ 6 ] Windows 10ビルド14971以降、PowerShellはファイルエクスプローラーに表示されるデフォルトのコマンドシェルとしてコマンドプロンプトに取って代わりました。[ 7 ] [ 8 ]
PowerShellでは、管理タスクは通常、コマンドレット(command-letsと発音します)を介して実行されます。コマンドレットは、特定の操作を実装する特殊な.NETクラスです。コマンドレットは、ファイルシステムやWindowsレジストリなどの様々なデータストア内のデータにアクセスすることで機能します。これらのデータは、プロバイダーを介してPowerShellで利用できます。サードパーティの開発者は、コマンドレットとプロバイダーをPowerShellに追加できます。 [ 9 ] [ 10 ]コマンドレットはスクリプトから使用でき、スクリプトはモジュールにパッケージ化できます。コマンドレットは.NET APIと連携して動作します。
PowerShell は.NET Remoting、WS-Management、CIM、およびSSHをサポートしているため、管理者はローカルとリモートの両方の Windows システムで管理タスクを実行できます。また、PowerShell はホスティングAPI も提供しており、これを使用することで PowerShell ランタイムを他のアプリケーションに埋め込むことができます。これらのアプリケーションは PowerShell の機能を使用して、グラフィカル インターフェイス経由で公開される操作も含め、特定の操作を実装できます。この機能は、Microsoft Exchange Server 2007 で、管理機能を PowerShell コマンドレットおよびプロバイダーとして公開し、必要なコマンドレットを呼び出す PowerShell ホストとしてグラフィカル管理ツールを実装するために使用されています。 [ 9 ] [ 11 ] Microsoft SQL Server 2008などの他の Microsoft アプリケーションも、管理インターフェイスを PowerShell コマンドレット経由で公開しています。[ 12 ]
PowerShellには、コマンドレット経由でアクセスできる、コンソールベースの包括的なヘルプ(Unixシェルのマニュアルページに似ています)が含まれています。コマンドレット経由では、インターネットから最新のローカルヘルプコンテンツを取得できます。また、スイッチ経由でWebヘルプを個別に取得することもできます。 Get-HelpUpdate-Help-onlineGet-Help
PowerShell を含むシェル プログラムは、MS-DOSやXenixなどの古いオペレーティング システムのシェルに由来しています。これらのシステム機能は、ほぼ例外なくコマンド ライン インターフェイス(CLI)経由でユーザーに公開されていました(MS-DOS 5には、補完的なグラフィカルDOS シェルも付属していました)。Windows 9xファミリには、MS-DOS のコマンド ライン環境であるCOMMAND.COM がバンドルされていました。一方、 Windows NTおよびWindows CEファミリには、COMMAND.COM からの大幅なアップグレードである新しいcmd.exeが付属していました。両方の環境とも、内部コマンドと外部コマンドの両方に CLI を提供し、バッチ ファイル(スクリプト用の比較的原始的な言語) による自動化も提供しています。
COM経由で公開されるソフトウェア コンポーネントを直接使用できないなど、これらのシェルの制限に対処するため、Microsoft は1998 年にWindows 98でWindows Script Hostとそのコマンド ライン ベースのホストを導入しました。これはActive Scriptエンジンと統合されており、 JScriptやVBScriptなどの互換性のある言語でスクリプトを記述できます。これらのスクリプトは COM コンポーネントを直接使用できますが、ドキュメントが比較的入手しにくく、セキュリティ対策の弱点を悪用した有名なコンピュータ ウイルスがいくつか発生したため、システムの脆弱性を突く攻撃として悪評を得ました。 cscript.exe
Windowsの異なるバージョンでは、 netshやWMICなど、独自のコマンドセットを備えた様々な特殊用途のコマンドラインインタープリタが提供されていましたが、相互運用性はありませんでした。Windows Server 2003ではコマンドラインエクスペリエンスの改善がさらに試みられましたが、スクリプトのサポートは依然として不十分でした。[ 13 ]

1990年代後半までに、インテルは、インテルCPU上で動作するWindowsを将来のインテルCPUの開発をサポートするのにより適切なプラットフォームにするための支援をマイクロソフトに求めてきた。当時、インテルCPUの開発は、RISCアーキテクチャCPU上でSolaris(Unixの派生型)を実行するサン・マイクロシステムズのコンピュータ上で行われていた。インテルの多くのKornShell自動化スクリプトをWindows上で実行する機能は、重要な機能であると認識されていた。マイクロソフト社内では、Kermitというコードネームで呼ばれていたKornShellのWindows移植版を作成する取り組みが始まった。[ 14 ]インテルは最終的に、インテルCPU上で動作可能なLinuxベースの開発プラットフォームに方向転換し、Kermitプロジェクトは不要になった。しかし、資金が十分あるチームを持つマイクロソフトのプログラムマネージャ、ジェフリー・スノーバーは、マイクロソフトが抱える管理自動化の問題に対して、より汎用的なソリューションを作成する機会があることに気付いた。
2002年までに、マイクロソフトはコマンドライン管理への新しいアプローチの開発を開始し、その中にはモナド(Microsoft Shell、MSHとも呼ばれる)と呼ばれるCLIも含まれていました。その背後にあるアイデアは、2002年8月にチーフアーキテクトのジェフリー・スノバーによって「モナド宣言」と呼ばれるホワイトペーパーで発表されました。[ 15 ] 2017年のインタビューで、スノバーはPowerShellの起源について説明し、WindowsでUnixツールを利用できるようにしようと試みたが、「 WindowsとLinuxの根本的なアーキテクチャの違い」のためにうまくいかなかったと述べています。具体的には、Linuxはすべてをテキストファイルと見なすのに対し、Windowsはすべてを「構造化データを返すAPI」と見なす点を指摘しました。両者は根本的に互換性がなかったため、彼は異なるアプローチを採用するに至りました。[ 16 ]
Monadは、斬新な設計を採用し、様々なコア管理タスクを自動化できる、拡張性の高い新しいCLIとなるはずでした。Microsoftは、2003年10月にロサンゼルスで開催されたProfessional Development Conferenceで初めてMonadを公開しました。数か月後、プライベートベータ版を公開し、最終的にパブリックベータ版へと発展しました。Microsoftは、2005年6月17日に最初のMonadパブリックベータ版を、2005年9月11日にBeta 2を、2006年1月10日にBeta 3を公開しました。

Monadの最初の発表から1年半後の4月25日、マイクロソフトはMonadをWindows PowerShellに改名し、同社の管理技術製品の重要な一部として位置付けると発表しました。[ 17 ] PowerShellのリリース候補版(RC版)1も同時にリリースされました。名称変更とRC版の両方で重要なのは、これが単なるアドオンではなく、Windowsのコンポーネントになったことです。
PowerShellバージョン1のリリース候補2は2006年9月26日にリリースされ、最終版は2006年11月14日にWeb上で公開されました。以前のバージョンのWindows向けのPowerShellは2007年1月30日にリリースされました。 [ 18 ] PowerShell v2.0の開発はPowerShell v1.0の出荷前に開始されました。開発期間中、マイクロソフトは3つのコミュニティテクノロジプレビュー(CTP)を出荷しました。マイクロソフトはこれらのリリースを一般に公開しました。Windows PowerShell v2.0の最後のCTPリリースは2008年12月に公開されました。
PowerShell v2.0は、Windows 7およびWindows Server 2008 R2の不可欠な部分として、2009年8月に完成し、製造部門にリリースされました。Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008用のPowerShellのバージョンは2009年10月にリリースされ、32ビットおよび64ビットプラットフォームの両方でダウンロード可能です。[ 19 ] 2009年10月号のTechNet Magazineで、MicrosoftはPowerShellの熟練度を「今後数年間でWindows管理者に必要となる最も重要なスキル」と呼んでいます。[ 20 ]
Windows 10にはPowerShellのスクリプト検証スイートであるPesterが同梱されていました。[ 21 ]

2016年8月18日、マイクロソフトはPowerShellをオープンソース化し、Windows、macOS、CentOS、Ubuntuをサポートするクロスプラットフォーム化したと発表しました[ 22 ]。[ 6 ]ソースコードはGitHubで公開されました。[ 23 ]オープンソース化により、「PowerShell Core」と呼ばれるPowerShellの2番目のバージョンが誕生しました。これは.NET Core上で動作します。これは、完全な.NET Framework上で動作する「Windows PowerShell」とは異なります。[ 24 ]バージョン5.1以降、PowerShell CoreはWindows Server 2016 Nano Serverにバンドルされています。[ 25 ] [ 26 ]
Pashというプロジェクトは、広く知られているUnixシェル「 bash 」をもじったもので、 Monoフレームワークを介してPowerShellをオープンソースかつクロスプラットフォームで再実装したものです。[ 27 ] PashはIgor Moochnickによって開発され、C#で記述され、GNU General Public Licenseの下でリリースされました。Pashの開発は2008年に中断されましたが、2012年にGitHubで再開されました。 [ 28 ]そして、PowerShellが正式にオープンソースかつクロスプラットフォームになった2016年に最終的に開発は中止されました。[ 29 ]
PowerShellの主要な設計目標は、Windows、Windows Management Instrumentation、.NET Framework、その他のソフトウェアに既に存在する多数のAPIを活用することでした。PowerShellのコマンドレットは、一般的に新しい機能を実装するのではなく、既存の機能をラップして公開します。その目的は、管理者と幅広い基盤機能との間に、管理者にとって使いやすく、より一貫性のあるインターフェースを提供することでした。PowerShellを使用すると、管理者は.NET、WMI、または低レベルのAPIコーディングの知識を必要とせず、PowerShellによって公開されるコマンドレットの使用に集中できます。この点で、PowerShellは新しい機能をほとんど追加せず、既存の機能を特定のユーザーにとってよりアクセスしやすいものにすることに重点を置いています。[ 30 ]
PowerShellの開発者は、ツールのコア文法をPOSIX 1003.2 KornShellの文法に基づいて設計しました。[ 31 ]
しかし、PowerShellの言語はPHP、Perl、その他多くの既存の言語の影響も受けています。[ 32 ]
PowerShellは4種類の名前付きコマンドを実行できます。[ 33 ]
.ps1)コマンドがスタンドアロン実行可能プログラムの場合、PowerShell はそれを別のプロセスで起動します。コマンドレットの場合は、PowerShell プロセスで実行されます。PowerShell は対話型のコマンドラインインターフェイスを提供し、そこでコマンドを入力してその出力を表示することができます。ユーザーインターフェイスでは、カスタマイズ可能なタブ補完が提供されています。PowerShell ではコマンドレットのエイリアスを作成でき、PowerShell はそれをテキストとして元のコマンドの呼び出しに変換します。PowerShell はコマンドに対して名前付きパラメータと位置パラメータの両方をサポートしています。コマンドレットの実行時に、引数値をパラメータにバインドする処理は PowerShell 自体によって行われますが、外部実行可能ファイルの場合、引数は PowerShell の解釈とは独立して外部実行可能ファイルによって解析されます。[ 34 ]
PowerShell拡張型システム(ETS)は.NET型システムをベースにしていますが、拡張されたセマンティクス(例えば、propertySetやサードパーティの拡張性)を備えています。例えば、データフィールド、プロパティ、メソッドのサブセットのみを公開することで、オブジェクトの異なるビューを作成したり、カスタム書式設定や並べ替えの動作を指定したりすることができます。これらのビューは、XMLベースの構成ファイルを使用して元のオブジェクトにマッピングされます。[ 35 ]
コマンドレットは、またはから派生した.NETクラスです。後者は、PowerShell ランタイムと対話する必要がある場合に使用されます。[ 36 ]基本クラスは、、、というメソッドを指定します。コマンドレットは、これらのメソッドをオーバーライドして、これらの関数が表すイベントに基づいて機能を提供します。オブジェクトがパイプライン入力を受け取ると、が呼び出されます。[ 37 ]オブジェクトのコレクションがパイプされている場合、コレクション内の各オブジェクトに対して メソッドが呼び出されます。コマンドレットクラスには、コマンドレットの名前を構成する動詞と名詞を指定する 属性が必要です。CmdletPSCmdletBeginProcessing()ProcessRecord()EndProcessing()ProcessRecord()CmdletAttribute
コマンドレット名は、 Get-ChildItemのように動詞と名詞の命名パターンに従っており、自己文書化される傾向があります。[ 36 ]一般的な動詞は列挙型として提供されます。[ 38 ] [ 39 ]
コマンドレットがパイプライン入力またはコマンドラインパラメータ入力を受け取る場合、対応するプロパティがクラス内に存在し、ミューテーター実装が実装されている必要があります。PowerShellは、パラメータ値またはパイプライン入力を使用してミューテーターを呼び出します。これらの値は、ミューテーター実装によってクラス変数に保存されます。これらの値は、機能を実装するメソッドによって参照されます。コマンドラインパラメータにマップされるプロパティはParameterAttribute[ 40 ]でマークされ、の呼び出し前に設定されますBeginProcessing()。パイプライン入力にマップされるプロパティも[41]でマークされますParameterAttributeが、ValueFromPipeline属性パラメータが設定されています。[ 42 ]
コマンドレットは任意の.NET API を使用でき、任意の.NET 言語で記述できます。また、PowerShell では、WriteObject()パイプラインへのオブジェクトの書き込みなど、PowerShell 固有の機能にアクセスするために使用される などの特定の API が利用できます。コマンドレットは、.NET データ アクセスAPI を直接使用することも、一意のパスを使用してデータ ストアをアドレス指定可能にするプロバイダーの PowerShell インフラストラクチャを使用することもできます。データ ストアはドライブ文字を使用して公開され、その中の階層はディレクトリとしてアドレス指定されます。PowerShell には、ファイル システム、レジストリ、証明書ストアのプロバイダーのほか、コマンド エイリアス、変数、関数の名前空間が付属しています。 [ 42 ] PowerShell には、ファイル システムなどのさまざまなWindowsシステムを管理したり、Windows Management Instrumentationを使用してWindows コンポーネントを制御したりするためのさまざまなコマンドレットも含まれています。他のアプリケーションはコマンドレットを PowerShell に登録して管理できるようにすることができ、コマンドレットがデータストア (データベースなど) を囲んでいる場合は、特定のプロバイダーを追加することもできます。
コマンドレットは、モジュール経由または v2 スナップインの前にシェルに追加できます。ユーザーは、PowerShell の基本インストールに含まれるコマンドレットに限定されません。
さまざまなバージョンの基本 PowerShell インストールに含まれるコマンドレットの数:
Unix パイプラインに似たパイプラインセマンティクスを有効にするために、コマンドレットは入力を受け取り、結果をオブジェクトとして出力します。コマンドレットが複数のオブジェクトを出力する場合、コレクションの各オブジェクトは、次のオブジェクトが処理される前にパイプラインに渡されます。[ 36 ] PowerShell パイプラインは、ステージを接続するパイプ () 演算子を使用して複雑なロジックを可能にします。ただし、PowerShell パイプラインは、ステージがオペレーティング システムによって調整される一連のプロセスとしてではなく、PowerShell ランタイム内で実行される点で、Unix パイプラインと異なります。さらに、バイト ストリームではなく、構造化された .NET オブジェクトがステージからステージへと渡されます。PowerShellランタイム内でオブジェクトを使用してステージを実行すると、データ構造をシリアル化したり、テキスト出力を明示的に解析してデータ構造を抽出する必要がなくなります。 [ 47 ]オブジェクトは、含まれているデータに対して機能する特定の関数をカプセル化することもでき、これは受信側コマンドで使用できるようになります。[ 48 ] [ 49 ]パイプラインの最後のコマンドレットでは、PowerShellは出力オブジェクトを自動的にコマンドレットにパイプし、コマンドレットはオブジェクトをフォーマットオブジェクトのストリームに変換して画面にレンダリングします。[ 50 ] [ 51 ]|Out-Default
PowerShellオブジェクトは.NETオブジェクトであるため、.ToString()オブジェクトの状態をシリアル化するためのメソッドを備えています。さらに、PowerShellでは書式定義を指定できるため、表示するデータ要素とその表示方法を選択することで、オブジェクトのテキスト表現をカスタマイズできます。ただし、下位互換性を維持するために、外部実行ファイルをパイプラインで使用する場合は、PowerShellの型システムに直接統合するのではなく、オブジェクトを表すテキストストリームを受け取ります。[ 52 ] [ 53 ] [ 54 ]
PowerShell には、スクリプト用の動的型付け 言語が含まれており、コマンドレットを使用して複雑な操作を命令的に実装できます。この言語は、変数、関数、分岐 ( )、ループ ( 、、、)、構造化エラー/例外処理、クロージャ/ラムダ式[ 55 ]に加えて、.NET との統合をサポートしています。PowerShell スクリプト内の変数には、プレフィックスが付きます。変数には、コマンドレットの出力を含め、任意の値を割り当てることができます。文字列は、一重引用符または二重引用符で囲むことができます。二重引用符を使用すると、変数は引用符内であっても展開されます。ファイルへのパスを、ドル記号に続く中括弧で囲む ( のように) と、名前空間変数表記法と呼ばれ、ファイルの内容への参照が作成されます。これをL-値として使用した場合、それに割り当てられたものはすべてファイルに書き込まれます。R-値として使用した場合、ファイルの内容が読み取られます。オブジェクトが割り当てられた場合は、格納される前にシリアル化されます。[ 56 ]if-then-elsewhiledoforforeach$${C:\foo.txt}
.オブジェクトのメンバーには、C#構文のような表記法 を使用してアクセスできます。PowerShellには$args、コマンドラインから関数に渡されるすべてのコマンドライン引数の配列である や、$_パイプライン内の現在のオブジェクトを参照する などの特殊変数が用意されています。 [ 57 ] PowerShellには、配列と連想配列も用意されています。PowerShell言語は、コマンドラインに入力された算術式を即座に評価し、GB、MB、KBなどの一般的な略語を解析します。[ 58 ] [ 59 ]
PowerShellでは、キーワードを使用してfunction関数を作成できます。単純な関数は、一般的に次のような構造になっています。[ 60 ]
関数名( [Type] $Param1 , [Type] $Param2 ) { # 命令}しかし、PowerShellでは、名前付きパラメータ、位置パラメータ、スイッチパラメータ、動的パラメータをサポートする高度な関数を使用できます。[ 60 ]
機能動詞-名詞{パラメータ(# 静的パラメータの定義)動的パラメータ{# 動的パラメータの定義}始める{# パイプラインの開始時に実行する命令のセット}プロセス{# パイプライン内の各項目に対して実行されるメイン命令セット}終わり{# パイプラインの最後に実行する命令のセット}}定義された関数は、次のいずれかの形式で呼び出されます。[ 60 ]
名前値1値2動詞-名詞 -パラメータ1値1 -パラメータ2 値2[]PowerShellでは、括弧( )で囲んだ名前空間を指定し、コロンのペア( )を使用して静的メソッドを示すことで 、任意の静的.NETメソッドを呼び出すことができます::。[ 61 ]例えば、
[コンソール] :: WriteLine ( "PowerShell" )PowerShellにはオブジェクトを作成する方法が数十種類あります。一度作成すれば、記法を用いてオブジェクトのプロパティやインスタンスメソッドにアクセスできます.。[ 61 ]
PowerShellは、生の文字列とエスケープされた文字列の両方を受け入れます。一重引用符で囲まれた文字列は生の文字列であり、二重引用符で囲まれた文字列はエスケープされた文字列です。PowerShellは、直線引用符と波引用符を同等に扱います。[ 62 ]
PowerShellでは以下の特殊文字がサポートされています: [ 63 ]
エラー処理のために、PowerShell は .NET ベースの例外処理メカニズムを提供します。エラーが発生した場合、エラーに関する情報を含むオブジェクト(Exceptionオブジェクト)がスローされ、これはtry ... catch構文(trap構文もサポートされています)を使用してキャッチされます。PowerShell は、例外を実際にスローすることなく、実行をサイレントに再開するように設定できます。これは、単一のコマンド、単一のセッション、または永続的に実行できます。[ 64 ]
.ps1PowerShell を使用して記述したスクリプトは、ファイルまたはファイル(後者はモジュールの実装に使用されます)のいずれかでセッションをまたいで保存できます.psm1。その後、スクリプト全体またはスクリプト内の個々の関数を使用できます。スクリプトと関数はコマンドレットと同様に動作し、パイプライン内のコマンドとして使用したり、パラメータをバインドしたりできます。パイプラインオブジェクトは、関数、スクリプト、コマンドレット間でシームレスに渡すことができます。スクリプトが誤って実行されるのを防ぐため、スクリプトの実行はデフォルトで無効になっており、明示的に有効にする必要があります。[ 65 ]スクリプトの有効化は、システムレベル、ユーザーレベル、またはセッションレベルのいずれかで実行できます。PowerShell スクリプトは、整合性を検証するために署名することができ、コードアクセスセキュリティの対象となります。[ 66 ]
PowerShell言語は、Cファミリーの多くのプログラミング言語でサポートされている科学的記法に似たバイナリプレフィックス記法をサポートしています。 [ 67 ]
PowerShell を管理アプリケーションに組み込んで使用することもできます。管理アプリケーションでは、PowerShell ランタイムを使用して管理機能を実装します。このために、PowerShell はマネージドホスティングAPIを提供します。この API を介して、アプリケーションは実行空間(PowerShell ランタイムの 1 つのインスタンス化) をインスタンス化できます。実行空間はアプリケーションのプロセスで実行され、オブジェクトとして公開されます。[ 9 ]実行空間の状態はオブジェクトに格納されます。実行空間が作成されると、PowerShell ランタイムはインスタンス化を初期化し、プロバイダーの初期化やコマンドレットの列挙などを行い、それに応じてオブジェクトを更新します。その後、実行空間は同期処理または非同期処理のいずれかで開く必要があります。その後、実行空間を使用してコマンドを実行できます。 RunspaceSessionStateSessionState
コマンドを実行するには、パイプライン (Pipelineオブジェクトで表される) を作成し、実行空間に関連付ける必要があります。パイプライン オブジェクトには、パイプラインを構成するコマンドレットが設定されます。順次操作 (PowerShell スクリプトなど) の場合、ステートメントごとに Pipeline オブジェクトが作成され、別の Pipeline オブジェクト内にネストされます。[ 9 ]パイプラインが作成されると、PowerShell はパイプライン プロセッサを呼び出します。パイプライン プロセッサは、コマンドレットをそれぞれのアセンブリ(コマンド プロセッサ) に解決し、それらへの参照をパイプラインに追加して、それらをInputPipe、OutputPipeおよびErrorOutputPipeオブジェクトに関連付け、パイプラインとの接続を表します。型は検証され、パラメーターはリフレクションを使用してバインドされます。[ 9 ]パイプラインが設定されると、ホストはInvoke()コマンドを実行する メソッド、またはその非同期の同等のを呼び出しますInvokeAsync()。パイプラインの最後にコマンドレットがある場合はWrite-Host、結果がコンソール画面に書き込まれます。ない場合は、結果がホストに渡され、ホストはさらに処理を適用するか、出力自体を表示します。
Microsoft Exchange Server 2007は、ホスティングAPIを使用して管理GUIを提供します。GUIに表示される各操作は、一連のPowerShellコマンド(パイプライン)にマッピングされます。ホストはパイプラインを作成し、実行します。実際、対話型PowerShellコンソール自体がPowerShellホストであり、コマンドラインで入力されたスクリプトを解釈しPipeline、必要なオブジェクトを作成して呼び出します。
DSCはソフトウェア環境をどのように構成すべきかを宣言的に指定することを可能にする。[ 68 ]
構成を実行すると、DSC はシステムが構成に記述された状態を確実に取得するようにします。DSC 構成はべき等です。ローカル構成マネージャー(LCM) は、リソース(DSC の命令型要素)によって記述された制御フローを使用してシステムを定期的にポーリングし、構成の状態が維持されていることを確認します。
すべてのメジャー リリースは引き続きサポートされており、各メジャー リリースには以前のバージョンとの下位互換性が備わっています。
PowerShell は当初「Monad」というコード名を使用していましたが、2003 年 10 月にロサンゼルスで開催された Professional Developers Conference で初めて公開されました。
Windows PowerShellと名付けられたバージョン1.0は、2006年11月にWindows XP SP2、Windows Server 2003 SP1、Windows Vista [ 69 ]およびWindows Server 2008のオプションコンポーネントとしてリリースされました。

バージョン2.0はWindows 7およびWindows Server 2008 R2と統合されており[ 70 ] 、 Windows XP Service Pack 3、Windows Server 2003 Service Pack 2、Windows Vista Service Pack 1向けにリリースされています。[ 71 ] [ 72 ]
このバージョンには、言語とホスティングAPIの変更に加えて、240以上の新しいコマンドレットが含まれています。[ 73 ] [ 74 ]
新機能は以下のとおりです。[ 75 ] [ 76 ] [ 77 ]
BeginProcessing()、ProcessRecord()および関数がいつ呼び出されるか制御できます。EndProcessing()Out-GridViewオブジェクトに表形式のデータを表示する が含まれます。-Split、、-Joinおよび Splatting ( @) 演算子。<#:とを区切り文字として使用したブロックコメントのサポート#>。[ 81 ]RunspacePools作成まで、多岐にわたります。新しいAPIは、トランザクションへの参加もサポートします。バージョン3.0は、Windows 8、Windows Server 2012、Windows 7 Service Pack 1、Windows Server 2008 Service Pack 1、Windows Server 2008 R2 Service Pack 1と統合されます。 [ 82 ] [ 83 ]
バージョン3.0は、より大きなパッケージであるWindows Management Framework 3.0 (WMF3)の一部であり、リモート処理をサポートするWinRMサービスも含まれています。 [ 83 ] MicrosoftはWMF3のコミュニティテクノロジプレビューを複数回リリースしました。Windows Management Framework 3.0の初期コミュニティテクノロジプレビュー2 (CTP 2)バージョンは、2011年12月2日にリリースされました。[ 84 ] Windows Management Framework 3.0は2012年12月に一般提供が開始され[ 85 ]、Windows 8およびWindows Server 2012にデフォルトで含まれています。[ 86 ]
新しい機能は次のとおりです。[ 83 ] [ 87 ] : 33–34
get-WmiObject win32_logicaldisk:以前は WMI 経由で実行されていたディスク、ボリューム、ファイアウォール、ネットワーク接続、プリンターを管理する機能を含む、数十の新しいモジュールが追加されました。バージョン4.0は、Windows 8.1、Windows Server 2012 R2、Windows 7 SP1、Windows Server 2008 R2 SP1、Windows Server 2012と統合されています。[ 88 ]
新しい機能は次のとおりです:
RemoteSigned。
バージョン5.0は、重大なバグを含む最初のリリースの後、2016年2月24日にWindows Management Framework (WMF) 5.0とともに再リリースされました。[ 92 ]
主な機能は次のとおりです:
classキーワードenumを作成する新しいキーワードOneGetChocolateyパッケージマネージャーをサポートするコマンドレット[ 93 ]バージョン5.1は、2016年8月2日のWindows 10 Anniversary Update [ 95 ]およびWindows Server 2016でリリースされました。[ 96 ] PackageManagementはプロキシをサポートし、PSReadLineはViModeをサポートし、2つの新しいコマンドレットGet-TimeZoneとSet-TimeZoneが追加されました。LocalAccountsモジュールでは、ローカルユーザーアカウントの追加/削除が可能です。[ 97 ]プレビュー版は、2016年7月16日にWindows 7、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012、Windows Server 2012 R2向けにリリースされ、[ 98 ] 2017年1月19日にリリースされました。[ 99 ]
バージョン5.1は、「Desktop」と「Core」の2つのエディションで提供される最初のバージョンです。「Desktop」エディションは.NET Frameworkを使用する継続製品ラインであり、「Core」エディションは.NET Core上で動作し、Windows Server 2016 Nano Serverにバンドルされています。後者はフットプリントが小さい代わりに、クリップボードの管理やコンピューターのドメイン参加のためのコマンドレット、WMIバージョン1のコマンドレット、イベントログのコマンドレット、プロファイルなどの一部の機能が欠けています。[ 26 ]これはWindows専用の最終バージョンでした。バージョン5.1はWindows 10、Windows 11、Windows Server 2022にプリインストールされていますが、.NETバージョンは別途インストールする必要があり、.NET Frameworkバージョンと並行して実行できます。[ 100 ] [ 101 ]
PowerShell Coreに改名されたバージョン6.0は、2016年8月18日に初めて発表されました。このとき、Microsoftは製品をクロスプラットフォーム化し、Windowsから独立させ、無料かつオープンソースにすることを発表したのです。[ 6 ] 2018年1月10日にWindows、macOS、Linux向けに一般提供が開始されました。[ 102 ]独自のサポートライフサイクルがあり、Windows 10で導入されたMicrosoftのライフサイクルポリシーに準拠しています。PowerShell Coreの最新バージョンのみがサポートされます。Microsoftは、PowerShell Core 6.0のマイナーバージョンを6ヶ月ごとに1つリリースする予定です。[ 103 ]
このバージョンにおける最も重要な変更点は、他のプラットフォームへの拡張です。Windows管理者にとって、このバージョンには大きな新機能は含まれていませんでした。2018年1月11日に行われたコミュニティへのインタビューで、開発チームはWindows ITプロフェッショナルがバージョン5.1からバージョン6.0に移行する際に最も期待される10のことを挙げるよう求められました。これに対し、MicrosoftのAngel Calvo氏は、クロスプラットフォームとオープンソースの2つしか挙げることができませんでした。[ 104 ] PowerShell 6では、一部の例外を除き、デフォルトのエンコーディングがUTF-8に変更されました。 [ 105 ](バージョン7.4では、UTF-8への変更がさらに拡大しました)[ 106 ]
マイクロソフトによると、バージョン6.1の新機能の一つは「Windows 10およびWindows Server 2019の1900以上の既存コマンドレットとの互換性」である。[ 107 ]しかし、これらのコマンドレットの詳細は変更ログの完全版には記載されていない。[ 108 ]マイクロソフトは後に、PowerShell CoreがWindows PowerShell 5.1を置き換えることができず、Windowsで普及しなかったため、この数値は不十分だったと主張している。[ 109 ]しかし、Linuxでは人気があった。[ 109 ]
バージョン6.2は、主にパフォーマンスの向上、バグ修正、開発者の生産性を向上させる小さなコマンドレットと言語の機能強化に重点を置いています。[ 110 ]
PowerShellに改名されたバージョン7は、以前の製品ラインであるPowerShell CoreとWindows PowerShellに取って代わります。[ 111 ] [ 109 ]開発の焦点は、バージョン7をバージョン5.1の実行可能な代替品にすること、つまりWindowsに同梱されているモジュールとの互換性の点でバージョン5.1とほぼ同等にすることでした。[ 112 ]
新機能は以下のとおりです。[ 113 ]
-ParallelのスイッチForEach-ObjectGet-Errorレット&&および||) を使用すると、パイプライン内の次のコマンドレットを条件付きで実行できます。??合体演算子??=代入演算子Invoke-DscResource(実験的)Out-GridViewコマンドレットの復活-ShowWindowスイッチの返却Get-Helpバージョン7.2は、バージョン7.0に続く長期サポートバージョンです。.NET 6.0を使用し、Linux用のユニバーサルインストーラーパッケージを備えています。Windowsでは、バージョン7.2以降のアップデートはMicrosoft Updateサービスを通じて提供されます。この機能はバージョン6.0から7.1では提供されていません。[ 114 ]
バージョン7.3には、一般的なコマンドレットの更新と修正、リリースパイプラインでのフレームワーク依存パッケージのテスト、ビルドとパッケージの改善が含まれています。[ 115 ]
バージョン7.4は.NET 8をベースにしており、長期サポート(LTS)リリースとみなされています。[ 116 ]
変更点は以下の通り: [ 117 ]
バージョン7.5は、2025年1月にリリースされた最新の安定版リリースです。.NET 9.0.1をベースに構築されており、パフォーマンス、ユーザビリティ、セキュリティの強化が含まれています。[ 118 ]主な更新内容には、タブ補完の改善(型推論の改善、新しい引数補完機能の追加など)に加え、Invoke-WebRequestおよびInvoke-RestMethodの修正が含まれています。また、このリリースでは、新しいConvertTo-CliXmlおよびConvertFrom-CliXmlコマンドレットが追加され、PSReadLineやMicrosoft.PowerShell.PSResourceGetなどのコアモジュールが更新されています。互換性に影響する変更点としては、Test-Pathパラメータの処理方法の更新と、New-FileCatalogのデフォルト設定などがあります。
GAリリースの前に、PowerShell v7.5.0のプレビューリリースが5回、RCリリースが1回ありました。[ 119 ]このバージョンの完全リリースのブログ投稿がまもなく予定されています。
バージョン7.6は.NET 9をベースにした最新のプレビューリリースです。最初のプレビューリリースv7.6.0-preview.2 [ 120 ]は2025年1月15日にリリースされました。
変更内容: 未定[ 121 ]
以下の表には、PowerShell に付属する様々なコマンドレットが示されています。これらのコマンドレットは、他のシェルのコマンドと非常によく似た機能を持っています。これらのコマンドレットの多くは、他のシェルのユーザーにも使い慣れた操作性を実現するために、定義済みのエイリアスを通じてユーザーに公開されています。
注記
lsは PowerShell Core の Linux バージョンには存在しませんmanは PowerShell Core の Linux バージョンには存在しませんcurlおよびwgetPowerShell Core には、同様の名前のネイティブコマンドと干渉しないように、これらのコマンドは存在しません。ここで注目すべき機能は、事実上すべての管理ユーティリティがコマンドラインから操作できるようになったことです(そのほとんどはtelnet経由でも利用可能です)。
Kornシェル
のPOSIX 1003.2文法に基づいています。
Windows PowerShell 3.0には、Windows 8に約1,000個のコマンドレットが付属しています。
Windows PowerShell 5.0には、Windows 10で約1,300個のコマンドレットが付属しています。
デフォルトのエンコードは、New-ModuleManifestを除き、BOMなしのUTF-8です。