今回は、
の続きです。
今回の対象範囲
WMF 5.1 の PowerShell エンジン機能強化 | Microsoft Docs
についてわかる範囲で補足を入れていく感じにします。
パフォーマンス
パフォーマンスの改善について
いくつかの重要な部分でパフォーマンスが向上しました。
* 起動
* ForEach-Object や Where-Object などのコマンドレットに対するパイプライン処理が、約 50% 速くなりました
については、仮想マシン上の検証環境で試してる限りでは「気持ち早くなったかな?」という程度でした。
ベンチマーク結果については環境に依存する部分もあるでしょうし、軽く捉えておけば良いかと思います。
起動時の処理について
そして、Noteにさらっと重要なことが書いてあります。
起動に関連する 1 つの変更が、一部のサポートされていないシナリオに影響を与える可能性があります。
PowerShell は $pshome*.ps1xml ファイルを読み込まなくなりました。これらのファイルは、XML ファイルの処理でファイルと CPU にオーバーヘッドが発生しないよう、C# に変換されています。
$pshome\*.ps1xml
は要はpowershell.exe
と同じフォルダに置かれたXMLファイルで以下の二種類あります。
*.format.ps1xml
- オブジェクトの表示書式の設定*.types.ps1xml(typesv3.ps1xml)
- オブジェクトの型に対する追加情報
フォルダ構成としてはこんな感じ。個別のファイルの説明はしません(
パフォーマンス向上のためにXMLファイルの読み込みを止め、その部分をC#のコードにしたとの事なのですが、ざっと調べた限りではC#のコードがどこにあるのかわかりませんでした。
(単純にXMLがリソースになったという感じではありませんでした。継続して調べていきたいですね...)
変換されたc#のコードはSystem.Management.Automation.dll
中のSystem.Management.Automation.Runspaces
名前空間に各ps1xmlファイルと対になるクラスになっていました。
例えばFileSystem.format.ps1xml
であればSystem.Management.Automation.Runspaces.FileSystem_format_Ps1Xml
クラスになっています。
なお、起動時に*.ps1xml
読まなくなっただけで*.ps1xml
が使われなくなったわけではないのでご注意ください。
*.format.ps1xml
ファイルとUpdate-FormatData
コマンドレットを使った表示のカスタマイズや、*.types.ps1mxl
とUpdate-TypeData
を使ったオブジェクトのカスタマイズはこれまで通り利用可能です。
最後に、
これらのファイルは V2 のサイド バイ サイド インストールをサポートするためにまだ存在するので、ファイルの内容を変更した場合、V5 には影響がなく、影響を受けるのは V2 だけです。 これらのファイルの内容を変更するシナリオはサポートされていないことに注意してください。
とある様にこの変更の影響を受けるのはPowerShell 5.1のみとなります。
powershell.exe -version 2.0
とバージョン指定してPowerShell 2.0を実行したときは*.ps1xml
は読み込まれます。
(ちなみに3.0~5.0は読み込まれませんでした。起動時にロードする.NET Frameworkの違いによるものでしょう。)
簡単な例で試してみます。
FileSystem.fromat.ps1xml
を以下の図の様に修正し、Get-ChildItem(ls)
したときに表示されるファイルのLastWriteTime
を和暦に変えるカスタマイズをしてみました。
PowerShell 5.1を起動してもこの変更は読み込まれず、Get-ChildItem(ls)
の結果は変わりませんが、
powershell.exe -version 2.0
とした場合は表示が変わることが確認できます。