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

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

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

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

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

www.amazon.co.jp

目次

著者様

@m0t0k1m0t0k1 さんです。

twitter.com

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

http://m0t0k1x2.tumblr.com/post/132636489419/はじめようwindowspowershellの電子書籍がamazonでも購入できるようになりました
m0t0k1x2.tumblr.com

感想

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

誰向け?

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

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

内容

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

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

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

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

気になる点

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

PSObject

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

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

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

tech.guitarrapc.com

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

パイプライン

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

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

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

pierre3.hatenablog.com

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

パラメータ

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

ScriptAnalyzer in GitHub and availability on PowerShell Gallery - Windows PowerShell Blog - Site Home - MSDN Blogs

github.com

f:id:guitarrapc_tech:20151121171649p:plain

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

github.com

外部ファイルを実行

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

github.com

f:id:guitarrapc_tech:20151121171607p:plain

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

モジュール

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

tech.guitarrapc.com

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

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

function と filter

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

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

まとめ

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

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

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

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