tech.guitarrapc.cóm

Technical updates

Windows Management Framework 5.0 RTM (PowerShell 5.0 RTM) が再リリースされました

おかえりなさい。

ということで、リリースされて一週間で撤収された WMF 5.0 (PowerShell 5.0) RTM でしたが、ようやくバグ修正が終わり再リリースされました。

Download Windows Management Framework 5.0 (Superceeded by WMF 5.1 RTM version: http://aka.ms/wmf5download) from Official Microsoft Download Center

目次

回収理由

以前も説明しましたが、$PSModulePath が WMF5.0 のインストール時に上書かれる問題があったためです。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11148471-bug-wmf5-rtm-psmodulepathwindowsserver.uservoice.com

前回との違い

ほぼアリマセン。

  • The KB numbers of these packages (KB3134758, KB3134759, and KB3134760) are different than previously released WMF 5.0 RTM packages (KB3094174, KB3094175, and KB3094176)
  • These packages have fixes only for the PSModulePath issue compared to the previously released WMF 5.0 RTM packages

ということで、インストールKB が変わりました。 そして、修正されたのは PSModulePath 問題だけです。

Operating System アーキテクチャ インストールパッケージ名
Windows Server 2012 R2 x64 Win8.1AndW2K12R2-KB3134758-x64.msu
Windows Server 2012 x64 W2K12-KB3134759-x64.msu
Windows Server 2008 R2 x64 Win7AndW2K8R2-KB3134760-x64.msu
Windows 8.1 x64 Win8.1AndW2K12R2-KB3134758-x64.msu
Windows 8.1 x86 Win8.1-KB3134758-x86.msu
Windows 7 SP1 x64 Win7AndW2K8R2-KB3134760-x64.msu
Windows 7 SP1 x86 Win7-KB3134760-x86.msu

ということは、New-ScheduledTaskTrigger 問題残ってるかもですが..。

インストール時の注意

You must uninstall previously released WMF 5.0 RTM (KB3094174, KB3094175, and KB3094176) packages.

以前の WMF5.0 はアンインストールしてください。

Windows 10 や Windows Server 2016TP への影響

Windows 10 and Windows Server 2016 Technical Previews builds are not impacted by the above mentioned PSModulePath issue. This issue was only impacting down-level systems where WMF 5.0 RTM can be installed.

ありません。あくまでも、Windows Server 2012R2 や Windows 8.1 などのダウンレベルOS のみです。

BuildInsider での詳細機能紹介

さて、PowerShell v5 がリリースされる。ということで、Build Insider で記事を書いております。

www.buildinsider.net

当初、2015年12月22日リリースだったこともあり、早々に記事を用意していたのですがその後回収されてしまったので 2ヶ月近くオクラ入りになってました。

さて、今回の記事を書くにあたって、編集者の @isshiki様と新しい試みを試しました。GitHub での記事の編集作業です。

www.buildinsider.net

コミット履歴で まさかの revert があるように、当初かなりやり方の意識に相違があったため戸惑いましたが、結果としては非常に楽になりました。これもすべて、@isshiki 様が良くしようという努力をしてくださったからです。今回の試みは、記事執筆、推敲、進捗どうですかなどの様々な面で Build Insider の記事執筆時に感じていた辛さが軽減されました。このスタイルを望む人にとって標準になると嬉しいですね。

PowerShell Team の Twitter アカウント

PowrShell Team の Twitter アカウントが @PowerShell_Team 開設されました。ここでもBuidInsiderの記事を紹介してあります。海外から見ると日本語記事は相当とっつきにくいのですが、Translator なりで参考になればいいですね。

まとめ

ぜひ WMF5.0 をお楽しみください!

tech.guitarrapc.com

WMF 5.0 (PowerShell 5.0) の再リリース予定が発表されました

WMF 5.0 (PowerShell 5.0) は、2015/12/16 にリリースされてから、12/23 に PSModulePath 上書きをはじめとするバグがあったことで回収されてました。

長らく再リリース日が未確定でしたが、本日リリース予定日として 2016年2月末日が予告されました。

blogs.msdn.microsoft.com

Updated 02/08/2016 – Thank you for your continued patience. We have fixed the offending PSModulePath issue and tested it thoroughly. We are working towards getting properly signed WMF 5.0 RTM builds. Now, we expect that around end of February you will be able to download the revised packages.

ということで、お待ちください。

PowerShell 5.0 で使える機能をまとめた記事も用意してあるので、リリースされ次第公開します。

WeatherHacks を触ってみる

Twitter を眺めていると面白そうなのをみつけたので、自分ならどう書くか考えてました。

https://www.baku-dreameater.net/archives/8741#more-8741www.baku-dreameater.net

ただやるのでは楽しくないので、PowerShell との比較です。

目次

コードサンプル

素直だったので、てきとーにいきましょう。エラーハンドルはここではしていません。

4つ用意しました。

gist.github.com

WeatherHacks.cs

元との違いは HttpClient 使ってることぐらいです。サクッとデータ取るにはいいのです。

WeatherHacksClass.cs

JSON をいちいちパースするのがつらいので、普段はクラスとして一気にデシリアライズしています。

Visual Studio2013 以降は JSON String を貼り付けるときに、自動的にクラス変換する機能があります。そこで、適当に PowerShell や LINQPad で取得したJSONをクリップボードにコピーして、VS2015 で貼り付けるだけで クラスが生成できます。

あとは普通です。

WeatherHacksClass.ps1

PowerShell v5 の クラス構文で C# に近いコードの再現例です。

PowerShell では Invoke-RestMethod Cmdlet で超お手軽簡単にAPIを叩いてオブジェクトとして取得できます。が、そのままでは型が PSCustomObjectとなりとてもつらくなります。これはクラスに結果を突っ込めば解消できるので、C# で取得したクラスをちょちょいと持ってくるか、JSON String をクラスに自動変換する何かを書けばいいでしょう。

ちなみに PasteJSONasPowerShell はダメです。PSCustomObject にしちゃうのでこのケースでは意味を成しません。

ConvertToClass がいい感じでしょう。*1

WeatherHacksFunction.ps1

クラス構文がない PowerShell v4 では、C# クラスを Add-Type するか、妥協して PSCustomObject でどうぞ。

まとめ

API を一発叩くだけなら、PowerShell でもいいのですが、いかんせん非同期処理はコールバック地獄一直線なので、非同期処理するなら C# 一択です。

*1:Class 名が重複した場合の処理が入っていないのでIssueにあげてあります https://github.com/dfinke/ConvertToClass/issues/2

Event Tracing for Windows (ETW) の トレースプロバイダーリストを取得してみる

ネットワークキャプチャといえば、Wireshark や Microsoft Message Analyzer が定番です。今回、USB や Bluetooth のキャプチャもできることを教わりました。

USBなど の通信ログは ETW (Event Tracing for Windows) に流れてくるのでEtwStreamでログをキャプチャできることも教わりました。そこで今回は、USB キャプチャなど各種Windows のトレースプロバイダーをEtwStream でキャプチャするために必要なトレースプロバイダー一覧を取得してみましょう。

このプロバイダーさえ把握できれば、USBに限らず自分で任意のトレースイベントを EtwStream でキャプチャできますからね!

目次

USB キャプチャ

先にキャプチャの様子です。 それぞれ Twitter で教わりました。

Wireshark

Wireshark をダウンロードしてインストールすれば利用できます。

Wireshark · Download

詳細は Wikiやググると豊富にあるので参照しましょう。

USB

Microsoft Message Analyzer

次は Microsoft Message Analyzer です。Windows におけるGUIキャプチャで実質最強なのは Wireshark ではなくMicrosoft Message Analyzerなのは多くの人が同意できるのではないでしょうか。Wireshark とか何年も触ってません。

Microsoft Message AnalyzerもUSB キャプチャに対応しています。

ダウンロードしてインストールは Wireshark より簡単です。

https://www.microsoft.com/en-us/download/details.aspx?id=44226

Microsoft から詳細動画が公開されているので見てみるといいでしょう。

Universal Serial Bus (USB) - Windows drivers | Microsoft Learn

EtwStream

そして、私たち開発者にとって一番うれしいのが EtwStream でも見れることです。

github.com

USBに限らずネットワークキャプチャもそうですが、通信にかかわる膨大なログから「狙いを付けて絞りこんで加工してみる」というのは手間です。Wireshark や Microsoft Message Analyzer の独自クエリは大げさかつだるいのですよね。そのため、EtwStream のように、自在にRxでグルーピングなどが容易にできてプログラムに組み込めるのは強力な長所といえます。普段 Fiddler をお使いの開発者にとっても思ったことはあるのではないでしょうか。

ETW Trace Provider

さてEtwStream の.FromTraceEvent(string[] providerNameOrGuid) はとても強力ですが、どのトレースプロバイダーかワカラナイとそもそもトレースできません。そして、トレースプロバイダーの指定はGUID.... ということで、各種プロバイダーの一覧を取得しましょう。

3種類用意しました。

  • logman
  • Get-NetEventProvider : PowerShell 4.0 (Windows 8.1 / Windows Server 2012 R2) から利用可能
  • Get-EtwTraceProvider : PowerShell 5.0 (Windows 10) から利用可能

gist.github.com

ただ、Get-EtwTraceProvider は、Name もでず GUID も無効なものが混じっているのでちょっと怪しいです。logman や Get-NetEventProvider にいらない管理者権限も必要なので、正直使わないです。

まとめ

EtwStream + Rx 最高です。Have a happy ETW life。

パイプラインの処理を途中で打ち切る方法のPowerShell版

PowerShell の最大の特徴と言われた時に、おそらく掲げるべきはパイプラインだと思います。

それが、cmd や Linux/Unix シェルにおけるパイプラインと異なる挙動だったり、オブジェクトを伝搬するという性質も含めて良くも悪くも PowerShell を PowerShell 足らしめているのはパイプラインかなと。

さて、パイプラインが特徴の PowerShell ですが、問題がいくつかあります。その1つが、以下の記事にあるパイプラインの中断処理。

d.hatena.ne.jp

winscript.jp

今回は少しその辺をみてみましょう。

目次

StopUpstreamCommandsException

先に結論だけ書くと、Internal なクラスであっても System.Management.Automation.StopUpstreamCommandsException が一番楽ちんでしょう。

ということで、PowerShell版で書くなら雑にこんな感じで。あえて New-Object ではなく Add-Type しています。

gist.github.com

中で System.Collections.Queue を使ってるのはそれほどの意味はありません。入力されたオブジェクトをいいように扱うためです。なので、カウンタ変数を用意してでもお好きなようにやればいいと思います。

この方式なら、Cmdlet でも同様なので好きなように扱えるのもいいでしょう。

はじめは、ReferenceSource見て自分で実装するのでいいんじゃないかなと思いましたが、当然ながら面倒さが上回ったのでやめました。

仕様変更あったらどうしよう

そもそもその場合は、Select-Object も仕様変わります。もはやその時点で一緒かなと。

Select -Fist 1 の GetSteppablePipeline() でも PowerShell スクリプトならいいのですが、Cmdlet から PowerShell 関数呼ぶの悲しさしかないですし仕方ないのかなという妥協もあります。

Connect

ちなみにこの Internal Class なやつを Public にしてというリクエストはあります。ワークアラウンドに do{}while()Select-Object -First 1 の例もあります。

Bing

すでにPowerShell のフィードバックは、UserVoice に移っており、同フィードバックも転載されています。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11087865-enable-users-to-stop-pipeline-making-stopupstreamcwindowsserver.uservoice.com

なので、Stop-Pipeline Cmdlet や StopUpstreamCommandsException のパブリック化がこれに基づきされてほしいですね。Vote しましょう。

End が実行されないのも、フィードバックすればいいと思います。End で何かしらするのはリソース破棄以外にもあり得るので、実際あってほしいでしょう。PowerShell Team の書くスクリプトの中にも Process{} 句で配列にまとめて End{} 句で出力するパターンもあるので。

余談

こういったパイプラインの制限というか、まだまだいけてないシーンはあって、たとえば foreach(){} | .... もそれです。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11087667-make-the-foreach-statement-work-with-a-pipelinewindowsserver.uservoice.com

パイプラインの中断エラーを Write-Error で出せるようにとかもあります。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11088492-option-to-output-a-pipeline-terminating-error-viawindowsserver.uservoice.com

昔記事にした | Out-Null の遅さなども。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11088471-performance-of-out-null-drastically-worse-then-usiwindowsserver.uservoice.com

tech.guitarrapc.com

あとは、Where-Object などで {} 抜きで自動変数 $_ にアクセスしたいという例など。実際これほしいですよね。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11088306--should-be-accessible-without-curly-brackets-witwindowsserver.uservoice.com

まとめ

リフレクション最高 (