前々回に「.NET」の話をしたので(「あらためて「.NET」について整理する」)、ついでと言ってはなんだが、今回はPowerShellについても経緯と現状をまとめてみることにする。
2005年9月に米国で開催されたMicrosoftの開発者向けイベントProfessional Developers Conferenceで発表されたMonad。これが後にPowerShellと呼ばれるようになる。当時は、スクリプト言語として開発が進んでいた
例によって、また用語の話からで恐縮だが、「PowerShell」には「Windows PowerShell」と「PowerShell Core」があり、「PowerShell Core」は、Ver.7.0から「PowerShell 7」という名称が正式になった。
基本的に「Windows PowerShell」はWindowsに付属している「PowerShell」のことで、「PowerShell Core」はオープンソースでマルチプラットフォーム(LinuxとmacOSに対応)の「PowerShell」と考えれば間違いない。ただしPowerShell 7は、現在Windowsに標準添付されているWindows PowerShellの後継となる予定で、Windows PowerShellは、マイナーアップデートはあるかもしれないが終了す る方向だ。
PowerShellの登場からこれまで
Windowsの標準的なコマンドラインインタープリター(シェル)であるCMD.EXEは、MS-DOSのCOMMAND.COMをそのまま32bit化することで作られた。しかし、MS-DOS時代のメモリが潤沢に利用できない環境向けに作られたCOMMAND.COMは簡易なものだった。それでもバッチファイルの互換性などから、大幅な仕様変更は困難だった。
MicrosoftはWindows 95以降でCOMによるコンポーネント化を進めたが、CMD.EXEはそれに追従することができなかった。そこで開発されたのがWindows Scripting Host(WSH)だ。WSHは、COMを直接扱うことができ、さまざまなシステムプログラミングも可能なスクリプト言語だったが、ファイルに書かれたスクリプトを実行する言語システムであったため、コマンドラインインタープリターはCMD.EXEが引き続き使われた。そのために実行できるスクリプトは高度になったものの、コマンドライン自体は変わらなかった。
こうした反省から、Windows Vistaの開発では、新しいコマンドラインインタープリターが作られることになった。コードネーム「Monad」として発表されたシェルが、PowerShellと呼ばれることになる。
2006年に開催されたハードウェア開発者向けイベントのWinHECでは、Monadはコンセプトを変えPowerShellとして発表された
PowerShellの目的には大きく2つある。1つは高度なコマンドラインインタープリターとして動作すること、もう1つは.NET Frameworkを簡単に呼び出して処理を記述できることである。CMD.EXEでは、機械語プログラムを利用しないと、Win32APIを利用するコマンドを作成できなかった。このために新機能が搭載されると、管理用のコマンドも作成する必要があった。これをカバーしようとしたのがWSHだったが、シェルではなかったため、作業環境はMS-DOS時代とほとんど変わらなかった。
特に問題になったのが、Windows Serverの管理ツールだ。Unixの経験がある管理者は、コマンドラインでの処理を望んだし、管理ツールをすべてGUI化して用意するのも簡単ではない。Windows 2000のときにネットワーク管理専用のNetShが作られたが、シェルというわりには、ネットワーク関連の設定コマンドしか実行できず、複雑なコマンドを1つのプログラムにまとめたものでしかなかった。
PowerShellは、Vistaの開発期間中にプレビューなどが開始されたが、Vistaの開発がドタバタしたためか、最初のリリースには含まれず、あとからダウンロードする形になった。しかしそれ以降は、Windowsには必ずPowerShellが搭載されるようになり、Windows 8では、CMD.EXEの代わりにするかを選択できるようになった。
.NET Frameworkの機能を機械語プログラムで書かずに呼び出しできることを想定したPowerShellは、Windows 8.1まではWindowsのバージョンアップと連動してバージョンがあがった。ただし、1つ前のWindowsでも利用できるように、.NET Frameworkのバージョンをあとから追いかけるようになっていた。たとえば、Windows 8に搭載されたPowerShell 3.0は、.NET Framework 4.0で動作する。しかし、Windows 8に搭載されていた.NET FrameworkはVer.4.5だった。
PowerShellの大きな転機になったのは、PowerShell Coreの開発とオープンソース化である。2016年に現在使われているWindows PowerShell 5.1が登場したが、これを.NET Coreで開発した「Core」エディションが同時に登場している。.NET Frameworkで開発されたWindows PowerShellは、Desktopエディションと呼ばれる。
同年にPowerShell Coreは、オープンソース化されLinuxなどへの対応が発表された。正式版となるPowerShell Coreには、バージョン番号として6.0が付けられた。この時点で、Windows PowerShellをPowerShell Coreに置き換えることが構想されていたのだと考えられる。ただし、Windows PowerShell 5.1の後継となることが正式に発表されたのは2019年、PowerShell 7のプレビュー期間中のことである。
PowerShellの今と今後
現在は、PowerShell 7.2がプレビューされており、正式版(安定版とも)は、PowerShell 7.1.3である。ただし、今のところPowerShell 7.xは、ユーザーがインターネットからダウンロードしてインストールする必要があり、Windows 10に標準搭載されているのは、Windows PowerShell 5.1である。
PowerShell 7.xは、名称からCoreは取れたものの、エディション表示は、Coreのままである。
Windows PowerShellは、エディション(PSEdition)がDesktopになっているのに対して、PowerShell 7は、Coreになっている
PowerShell 7.xは、Windows PowerShell 5.1の上位版にあたる。基本的な部分はほぼ同等だが、一部の機能は強化されているほか、Windows PowerShellで標準組み込みになっていた機能の一部がプログラムモジュールとして分離されている。これは、マルチプラットフォーム化により、Windows固有の機能を分離したからだ。
たとえば、以前本連載で解説したMicrosoftストアアプリのパッケージを扱うAPPX関連のコマンドは、PowerShell 7.xではモジュールを別途読み込む必要がある。具体的には、APPX関連のコマンドを使う前に以下のコマンドでAPPXモジュールを読み込む必要がある。
Import-Module APPX -usewindowspowershell
同じ機能であっても、PowerShell 7とWindows PowerShell 5.1では、振る舞いが違う部分がある。たとえば、PowerShell 7では、文字のエスケープシーケンスに「Escコード」が追加され「`e」で参照できるようになっている。また、JSON中の「//」による注釈は、PowerShell 7.1ではエラーにならないが、Windows PowerShell 5.1ではエラーになるため処理前に取り除く必要がある。
PowerShell 7は、Windows PowerShellと違って、Windowsのバージョンアップとは別タイミングでバージョンアップされ、その寿命は開発に使われた.NET Coreと同期する。PowerShell 7.1では、.NET 5が利用されている。
PowerShellや.NETのオープンソース化は、Windows Azureと関係がある。Azureはクラウドであるため、接続するプラットフォームを問わない。しかし、まったくかけ離れていても、管理や運用に問題がある。
そこでAzureの関連で多くのMicrosoftのソフトウェアがオープンソース化している。Azureで使われているツールは、クライアントでも動作させ、ある意味“地続き”にしたいのだ。それは、Linuxサーバーで動作するソフトウェアをLinuxで開発するというのに似ている。筆者的には、LinuxでPowerShellを使おうという気持ちにはなれないが、仕事での必要性があれば使わざるをえないだろうとも考える。
そのうち、自分の作ったプログラムがローカルで動いているのか、クラウドで動いているのかを意識しなくなる時代が来る。少なくとも利用者側は、ローカルのアプリケーションとブラウザの中で動作しているクラウドサービスをほとんど区別していないし、スマートフォンなどではそもそも区別することが困難である。そんな時代にPowerShellで打ち込んだコマンドが勝手にクラウドサーバーを設定し、クラウドで処理して結果を表示するなんてことになるんじゃないかという気がしている。
2021-04-24 20:14:10