読者です 読者をやめる 読者になる 読者になる

素敵なおひげですね

PowerShellを中心に気分で書いているブログです。

WMF 5.1の新機能をざっくり説明する - 4. PowerShell エンジンの機能強化 編

Windows PowerShell

今回は、

  1. 新シナリオと機能 編
  2. バグ修正 編
  3. コンソール機能強化 編

の続きです。

今回の対象範囲

WMF 5.1 の PowerShell エンジン機能強化

についてわかる範囲で補足を入れていく感じにします。

パフォーマンス

パフォーマンスの改善について

いくつかの重要な部分でパフォーマンスが向上しました。
* 起動
* ForEach-Object や Where-Object などのコマンドレットに対するパイプライン処理が、約 50% 速くなりました

については、仮想マシン上の検証環境で試してる限りでは「気持ち早くなったかな?」という程度でした。
ベンチマーク結果については環境に依存する部分もあるでしょうし、軽く捉えておけば良いかと思います。

起動時の処理について

そして、Noteにさらっと重要なことが書いてあります。

起動に関連する 1 つの変更が、一部のサポートされていないシナリオに影響を与える可能性があります。
PowerShell は $pshome*.ps1xml ファイルを読み込まなくなりました。これらのファイルは、XML ファイルの処理でファイルと CPU にオーバーヘッドが発生しないよう、C# に変換されています。

$pshome\*.ps1xmlは要はpowershell.exeと同じフォルダに置かれたXMLファイルで以下の二種類あります。

  • *.format.ps1xml - オブジェクトの表示書式の設定
  • *.types.ps1xml(typesv3.ps1xml) - オブジェクトの型に対する追加情報

フォルダ構成としてはこんな感じ。個別のファイルの説明はしません(

f:id:stknohg:20160731184210p:plain

パフォーマンス向上のために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.ps1mxlUpdate-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を和暦に変えるカスタマイズをしてみました。

f:id:stknohg:20160731184704p:plain

PowerShell 5.1を起動してもこの変更は読み込まれず、Get-ChildItem(ls)の結果は変わりませんが、

f:id:stknohg:20160731184955p:plain

powershell.exe -version 2.0とした場合は表示が変わることが確認できます。

f:id:stknohg:20160731185006p:plain