Twitter を眺めていると、SQL と Azure のこわい人が気になることをおっしゃっていました。
電子書籍読んでたら、突然のぎたぱそせんせーのブログ
— Masayuki Ozawa (@Masayuki_Ozawa) November 19, 2015
@guitarrapc_tech https://t.co/nug0ZMudw5 を読んでいたところ、ギタパソ船せーのブログへのリンクがありました
— 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=UTF8&qid=1447980602&sr=8-1&keywords=%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86Windows+PowerShellwww.amazon.co.jp
目次
著者様
@m0t0k1m0t0k1 さんです。
ここでご本人も紹介しています。
m0t0k1x2.tumblr.com感想
面白かったです。20分程度で読み終わるぐらいの分量なので気軽に読むにもいいと思います。
誰向け?
まえがきにもありますが、「PowerShellをシステム管理者向けのシェルだと思っている方。PowerShellをもっと気楽に使い始めてみたい」と思っている方にぜひどうぞ。*1
非常に同感ですし、私にとって PowerShell とは「さくっと何か実行するときに走らせる実行環境」です。*2 実際、「C#ばかり書いているけど裏で勝手に自動化が回ってる。」という環境で働いています。この自動化を実行する環境の1つが PowerShell なだけです。
内容
「ざっくりしつつも、とりあえず誤解が少なく触れるようになる」ぐらいの温度感です。
変数の定義から、基本的な構文までざっくりまとまって書かれています。全般的に踏み込んだ説明を避けていらっしゃるのでとっつきやすいと思います。一番細かく説明されているのが Execution Policy なのは、ご本人が PowerShell 最大の壁とお考えのためでしょうか。
素晴らしいのは、それぞれに関してソースを明示した上で基本的な説明を欠かされていないことです。読んでてためになりました。
GUI のセクションで、$this
と $_
に触れてられてますが、これはうっかり忘れるんですがにいい説明ですね!
気になる点
いくつか古い記述やアンチパターン、理解が怪しそうな部分があって気になりました。
PSObject
直接New-Object PSObject
して触るのは、ほぼオワコンです。
クラスベース構文が出るのもそうですが、PowerShell v3.0 で追加された特殊な型[PSCustomObject]
が出てからは、実行効率/記述性の両面でNew-Object PSObject
はオワコンです。
この章にある、Add-Memeber
は使うシーンも稀にあるのですが、これも クラスベース構文でもともと少ない頻度がさらに減るでしょう。
PSObject を直で利用するのは、Select-Object {Name = ""; Expression = {}}
同様にかなりパフォーマンスも悪いのでもんにょりですね。
パイプライン
PowerShell のパイプラインに関しては、逐次処理が最大の特徴です。
これは、LINQ 同様に 無限リストを受け、パイプライン中のオブジェクトを自在に操作できることを意味しています。ただ単純にデータをつなぐことができる、流れてきた文字列を操作できるという以上の意味があるのです。*3
無限リストの例としては、EtwStream の待ち受けがいいでしょう。
機会があれば、もう少し踏み込んでほしいですね!
パラメータ
[Parameter(Position = 0)]
による、ポジショナルパラメータ利用は非推奨です。パラメータ名なしで関数やCmdletを実行することは、PSScriptAnalyzer でも検出されるアンチパターンとなっています。私自身つかうのでアレですが、利用シーンにもよりますがあまり推奨ではないです。
また、[Parameter(ParameterSetName = "hoge")]
に関して記述があります。そういえばブログで書いてなかったのですが、この利用は注意が必要です。特に、[CmdletBinding()]
でのDefaultParameterSetName
無しに利用するのはあまりいい例示ではないように思います。デフォルトでどう動作するかがないのは、かなり危険なので。これに関しては、PSScriptAnalyzer に Issue を上げては起きました。Positional Parameter ではじく考えならいいので、実装書くかは微妙ですがあったほうがいいレベルではあります。
外部ファイルを実行
ここで、Invoke-Expression
に触れていますが、これは Injection をもたらす可能性があり、PowerShellで最も使ってはいけない Cmdlet です。実際、PSScriptAnalyzer でも検出されます。
通常の処理ではめんどくさい記述も Invoke-Expression
を使うと驚くほど簡潔に書けるのですが、危険度ナンバーワンなので使っちゃだめです。
モジュール
ここで以前書いた記事が紹介されていました。ありがとうございますありがとうございます。
私個人としては、モジュールはバイナリモジュール か マニフェストモジュールですにゃ。スクリプトモジュールだと制御しにくいことが制御できるので。
モジュール機構は、そろそろ負の遺産が目立ってきているのでこの辺はそろそろ一新してほしいですねぇ。
function と filter
filter は、確かに使うシーンは少ないですが、かなり便利でできる子です。再評価されてもいいレベルで。
PowerShell はScriptBlock をもう少し進化させてほしいんですが、filter あたりうまく使ってくれないかなぁとか思ったり。
まとめ
PowerShell わからないので勉強になりました!
*1:ライセンスポリシーに、「本書の全部、または一部の複写、複製、転載を禁じます。」とあるので、私が受け取った意味合いで書いています。
*2:そういう意味でC# REPL を待ってるのです
*3:ただし外部コマンドファイルを除く http://tech.guitarrapc.com/entry/2014/02/10/221121