tech.guitarrapc.cóm

Technical updates

はじめようWindows PowerShell [Kindle版] を読んでみた

Twitterを眺めていると、SQLとAzureのこわい人が気になることをおっしゃっていました。

Masayuki Ozawa (@Masayuki_Ozawa) November 19, 2015

Masayuki Ozawa (@Masayuki_Ozawa) November 20, 2015

前々から読もうと思ってたので、いい機会なので読んでみました。

http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86Windows-PowerShell-%E6%9F%8F%E5%8E%9F%E5%9F%BA%E8%A6%8F-ebook/dp/B017LJOCJ2/ref=sr_1_1?ie=UTF-8&qid=1447980602&sr=8-1&keywords=%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86Windows+PowerShell

著者様

@m0t0k1m0t0k1さんです。

https://Twitter.com/m0t0k1m0t0k1

ここでご本人も紹介しています。

http://m0t0k1×2.tumblr.com/post/132636489419/%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86Windowspowershell%E3%81%AE%E9%9B%BB%E5%AD%90%E6%9B%B8%E7%B1%8D%E3%81%8Camazon%E3%81%A7%E3%82%82%E8%B3%BC%E5%85%A5%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F

感想

面白かったです。20分程度で読み終わるぐらいの分量なので気軽に読むにもいいと思います。

誰向け?

まえがきにもありますが、「PowerShellをシステム管理者向けのシェルだと思っている方。PowerShellをもっと気楽に使い始めてみたい」と思っている方にぜひどうぞ。*1

非常に同感ですし、私にとってPowerShellとは「さくっと何か実行するときに走らせる実行環境」です。*2 実際、「C#ばかり書いているけど裏で勝手に自動化が回ってる」という環境で働いています。この自動化を実行する環境の1つがPowerShellなだけです。

内容

「ざっくりしつつも、とりあえず誤解が少なく触れるようになる」ぐらいの温度感です。

変数の定義から、基本的な構文までざっくりまとまって書かれています。全般的に踏み込んだ説明を避けていらっしゃるのでとっつきやすいと思います。一番細かく説明されているのがExecution Policyなのは、ご本人がPowerShell最大の壁とお考えのためでしょうか。

素晴らしいのは、それぞれに関してソースを明示した上で基本的な説明を欠かされていないことです。読んでてためになりました。

GUIのセクションで、$this$thisに触れてられてますが、これはうっかり忘れるんですがにいい説明ですね!

気になる点

いくつか古い記述やアンチパターン、理解が怪しそうな部分があって気になりました。

PSObject

直接New-Object PSObjectして触るのは、ほぼオワコンです。

クラスベース構文が出るのもそうですが、PowerShell 3.0で追加された特殊な型[PSCustomObject]が出てからは、実行効率/記述性の両面で[PSCustomObject]はオワコンです。

この章にある、Add-Memeberは使うシーンも稀にあるのですが、これもクラスベース構文でもともと少ない頻度がさらに減るでしょう。

http://tech.guitarrapc.com/entry/2013/06/25/230640

PSObjectを直で利用するのは、Select-Object {Name = ""; Expression = {}}同様にかなりパフォーマンスも悪いのでもんにょりですね。

パイプライン

PowerShellのパイプラインに関しては、逐次処理が最大の特徴です。

これは、LINQ同様に無限リストを受け、パイプライン中のオブジェクトを自在に操作できることを意味しています。ただ単純にデータをつなぐことができる、流れてきた文字列を操作できるという以上の意味があるのです。*3

無限リストの例としては、EtwStreamの待ち受けがいいでしょう。

http://pierre3.hatenablog.com/entry/2015/11/14/123032

機会があれば、もう少し踏み込んでほしいですね!

パラメータ

[Parameter(Position = 0)]による、ポジショナルパラメータ利用は非推奨です。パラメータ名なしで関数やCmdletを実行することは、PSScriptAnalyzerでも検出されるアンチパターンとなっています。私自身つかうのでアレですが、利用シーンにもよりますがあまり推奨ではないです。

http://blogs.msdn.com/b/powershell/archive/2015/04/29/scriptanalyzer-in-github-and-availability-on-powershell-gallery.aspx

https://github.com/PowerShell/PSScriptAnalyzer/blob/f5cb4fcafa2186d17758447ff01122e91110a256/RuleDocumentation/AvoidUsingPositionalParameters.md

また、[Parameter(ParameterSetName = "hoge")]に関して記述があります。そういえばブログで書いてなかったのですが、この利用は注意が必要です。特に、[Parameter(ParameterSetName = "hoge")]での[Parameter(ParameterSetName = "hoge")]無しに利用するのはあまりいい例示ではないように思います。デフォルトでどう動作するかがないのは、かなり危険なので。これに関しては、PSScriptAnalyzerにIssueを上げては起きました。Positional Parameterではじく考えならいいので、実装書くかは微妙ですがあったほうがいいレベルではあります。

https://github.com/PowerShell/PSScriptAnalyzer/issues/366

外部ファイルを実行

ここで、Invoke-Expressionに触れていますが、これはInjectionをもたらす可能性があり、PowerShellで最も使ってはいけないCmdletです。実際、PSScriptAnalyzerでも検出されます。

https://github.com/PowerShell/PSScriptAnalyzer/blob/f5cb4fcafa2186d17758447ff01122e91110a256/RuleDocumentation/AvoidUsingInvokeExpression.md

通常の処理ではめんどくさい記述もInvoke-Expressionを使うと驚くほど簡潔に書けるのですが、危険度ナンバーワンなので使っちゃだめです。

モジュール

ここで以前書いた記事が紹介されていました。ありがとうございますありがとうございます。

http://tech.guitarrapc.com/entry/2013/12/03/014013

私個人としては、モジュールはバイナリモジュールかマニフェストモジュールですにゃ。スクリプトモジュールだと制御しにくいことが制御できるので。

モジュール機構は、そろそろ負の遺産が目立ってきているのでこの辺はそろそろ一新してほしいですねぇ。

function と filter

filterは、確かに使うシーンは少ないですが、かなり便利でできる子です。再評価されてもいいレベルで。

PowerShellはScriptBlockをもう少し進化させてほしいんですが、filterあたりうまく使ってくれないかなぁとか思ったり。

まとめ

PowerShellわからないので勉強になりました!

*1:ライセンスポリシーに、「本書の全部、または一部の複写、複製、転載を禁じます」とあるので、私が受け取った意味合いで書いています。

*2:そういう意味でC# REPLを待ってるのです

*3:ただし外部コマンドファイルを除くhttp://tech.guitarrapc.com/entry/2014/02/10/221121