| PowerShell | |
|---|---|
WindowsターミナルでのPowerShell 7.5.0セッションのスクリーンショット | |
| パラダイム | 命令型、パイプライン型、オブジェクト指向型、関数型、リフレクティブ |
| デザイン : | ジェフリー・スノーバー、ブルース・ペイエット、ジェームズ・トルーハー(他) |
| 開発者 | マイクロソフト |
| 初 登場 | 2006年11月 14日 ( 2006-11-14 ) |
| 安定放出 | |
| プレビュー版 | |
| タイピングの規律 | 強固で、安全で、暗黙的で、ダイナミック |
| 実装言語 | C# |
| プラットフォーム | PowerShell: .NET Windows PowerShell: .NET Framework |
| OS |
|
| ライセンス | MITライセンス[ 3 ](ただし、Windowsコンポーネントはプロプライエタリのままです) |
| ファイル名拡張子 |
|
| Webサイト | microsoft.com/powershell |
| 影響を受けた | |
| Python、シェルスクリプト、Perl、C#、CL、DCL、SQL、Tcl、Tk、[ 4 ] Chef、Puppet | |
PowerShell は、タスクの自動化と構成管理のためにMicrosoftが開発したシェルプログラムです。シェルの典型的な特徴として、対話的に使用するためのコマンドラインインタプリタと、定義された言語による自動化のためのスクリプトインタプリタを提供します。元々はWindows PowerShellとして Windows 専用でしたが、 PowerShell Coreの導入により、2016 年 8 月 18 日にオープンソース化され、クロス プラットフォームになりました。[ 5 ]前者は.NET Framework上に構築され、後者は.NET (以前は .NET Core) 上に構築されています。
PowerShell は最新バージョンの Windowsにバンドルされており、 macOSおよびLinuxにインストールできます。[ 5 ] Windows 10ビルド 14971以降、PowerShell はファイル エクスプローラーで公開されるデフォルトのコマンド シェルとしてコマンド プロンプトに取って代わりました。[ 6 ] [ 7 ]
PowerShell では、管理タスクは通常、特定の操作を実装する特殊な .NETクラスであるコマンドレット(コマンドレットと発音) を介して実行されます。これらは、ファイルシステムやWindows レジストリなどのさまざまなデータ ストアのデータにアクセスすることで機能します。これらのデータ ストアは、プロバイダーを介して PowerShell で利用できるようになります。サードパーティの開発者は、コマンドレットとプロバイダーを PowerShell に追加できます。[ 8 ] [ 9 ]コマンドレットはスクリプトで使用でき、スクリプトはモジュールにパッケージ化できます。コマンドレットは .NET APIと連携して動作します。
PowerShell は.NET Remoting、WS-Management、CIM、およびSSHをサポートしているため、管理者はローカルおよびリモートの Windows システムの両方で管理タスクを実行できます。PowerShell は、PowerShell ランタイムを他のアプリケーションに組み込むことができるホスティングAPIも提供しています。これらのアプリケーションは、PowerShell の機能を使用して、グラフィカル インターフェイスを介して公開されている操作を含む特定の操作を実装できます。この機能は、Microsoft Exchange Server 2007 で、管理機能を PowerShell コマンドレットおよびプロバイダーとして公開し、必要なコマンドレットを呼び出す PowerShell ホストとしてグラフィカル管理ツールを実装するために使用されています。[ 8 ] [ 10 ] Microsoft SQL Server 2008を含む他の Microsoft アプリケーションも、PowerShell コマンドレットを介して管理インターフェイスを公開しています。[ 11 ]
PowerShell には、コマンドレットからアクセスできる、コンソールベースの包括的なヘルプ ( Unix シェルのman ページと同様)が含まれています。更新されたローカル ヘルプ コンテンツは、コマンドレットを使用してインターネットから取得できます。または、スイッチを使用して、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を介して公開されているソフトウェア コンポーネントを直接使用できないといった制限があるため、マイクロソフトは1998 年にWindows 98とともにWindows Script Hostとコマンドライン ベースのホストを導入しました。これはActive Scriptエンジンと統合されており、 JScriptやVBScriptなどの互換性のある言語でスクリプトを作成できます。これらのスクリプトは COM コンポーネントを直接使用できますが、ドキュメントが比較的入手しにくく、セキュリティ 機能の弱点を悪用した著名なコンピュータ ウイルスが複数発生したことから、システムの脆弱性ベクトルとして悪名高いものとなりました。cscript.exe
Windows のさまざまなバージョンでは、独自のコマンド セットを備えたさまざまな特殊目的のコマンドライン インタプリタ ( netshやWMICなど) が提供されていましたが、それらは相互運用可能ではありませんでした。Windows Server 2003 では、コマンドライン エクスペリエンスをさらに改善しようと試みましたが、スクリプト サポートは依然として不十分でした。[ 12 ]

1990 年代後半までに、インテルはマイクロソフトに協力を求め、インテル製 CPU 上で動作する Windows を、将来のインテル製 CPU の開発をサポートするのに適したプラットフォームにするよう依頼した。当時、インテル製 CPU の開発は、RISCアーキテクチャの CPU 上でSolaris ( Unix の派生版)を実行するSun Microsystems のコンピュータで行われていた。インテルのKornShell自動化スクリプトを Windows 上で実行できることが重要な機能として認識された。マイクロソフトは社内で Korn Shell の Windows 版を作成する取り組みを開始し、コードネームは Kermit とされた。[ 13 ]インテルは最終的に、インテル製 CPU 上で動作するLinuxベースの開発プラットフォームに方向転換し、Kermit プロジェクトは不要となった。しかし、資金が十分に確保されたチームを擁するマイクロソフトのプログラム マネージャー、ジェフリー スノーバーは、管理自動化というマイクロソフトの問題に対する、より汎用的なソリューションを作成する機会があることに気づいた。
2002 年までに、マイクロソフトはコマンドライン管理への新しいアプローチの開発を開始し、その中には Monad ( Microsoft Shellまたは MSH とも呼ばれる) と呼ばれる CLI が含まれていました。その背後にあるアイデアは、チーフ アーキテクトのJeffrey Snoverによって 2002 年 8 月に「Monad Manifesto」と呼ばれるホワイト ペーパーで公開されました。[ 14 ] 2017 年のインタビューで、Snover は PowerShell の起源について説明し、Unixツールを Windows で利用できるようにしようとしていたが、「 Windows と Linux のコア アーキテクチャの違い」のためにうまくいかなかったと述べています。具体的には、Linux はすべてをテキスト ファイルとみなすのに対し、Windows はすべてを「構造化データを返すAPI」とみなすと指摘しました。これらは根本的に互換性がなく、それが彼が別のアプローチを取るきっかけとなりました。[ 15 ]
Monadは、さまざまなコア管理タスクを自動化できる斬新な設計の拡張可能なCLIとなる予定でした。マイクロソフトは、2003年10月にロサンゼルスで開催されたプロフェッショナル開発会議でMonadを初めて一般公開しました。数か月後、プライベートベータ版を公開し、最終的にパブリックベータ版へと発展しました。マイクロソフトは、2005年6月17日に最初のMonadパブリックベータ版を、2005年9月11日にベータ2を、2006年1月10日にベータ3をリリースしました。

2006年4月25日、最初のMonad発表から2年半後、MicrosoftはMonadがWindows PowerShellに名称変更され、同社の管理テクノロジー製品群の重要な一部として位置づけられたと発表した。[ 16 ] PowerShellのリリース候補版(RC)1も同時にリリースされた。名称変更とRCの両方において重要な点は、これが単なるアドオンではなく、Windowsのコンポーネントになったことである。最終版である1.0はWindows Vistaの一部として含まれた。
PowerShell バージョン 1 のリリース候補 2 は 2006 年 9 月 26 日にリリースされ、Web への最終リリースは2006 年 11 月 14 日に行われました。以前のバージョンの Windows 用の PowerShell は 2007 年 1 月 30 日にリリースされました。[ 17 ] PowerShell v2.0 の開発は PowerShell v1.0 の出荷前に開始されました。開発中、Microsoft は 3 つのコミュニティ テクノロジー プレビュー (CTP)を出荷しました。Microsoft はこれらのリリースを一般に公開しました。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 ビットの両方のプラットフォームでダウンロードできます。[ 18 ] 2009 年 10 月号のTechNet Magazineで、Microsoft は PowerShell の習熟を「今後数年間でWindows管理者が必要とする最も重要なスキル」と呼んでいます。 [ 19 ]
Windows 10には、PowerShell用のスクリプト検証スイートであるPesterが同梱されています。[ 20 ]

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

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