tech.guitarrapc.cóm

Technical updates

PowerShell 5.0 で搭載された using namespace シンタックスの概要

PowerShellから .NETクラスを呼び出して操作するときの最大の苦行。それが、クラスの名前空間を毎回毎回書かないといけないことです。

たとえば、List(T) を扱うとこうなります。無駄に使ってみましょう。

https://gist.github.com/guitarrapc/1149232432474369647c

ジェネリクスの扱いつらぽよ。

Item : 0
Item : 1
Item : 2
Item : 3
Item : 4
Item : 5
Item : 6
Item : 7
Item : 8
Item : 9

C# ならusing <NameSpace>が用意されているのでいいのですが、PowerShellでは名前空間を省略する方法がなくつらかったわけです。

これがPowerShell 5.0で変わります。

言語仕様上の using シンタックス

実は言語仕様上の予約語にはusingがずっとあったのです。

言語仕様でも

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

予約語ヘルプにもあります。

https://technet.microsoft.com/en-us/library/hh847868.aspx

将来のためってことで。

The keywords class, define, from, using, and var are reserved for future use.

そもそも言語仕様が3.0までしか公開されてないのがもにょん

蛇足

ちなみに、過去にはPoweShell Teamブログでこんな感じでIDisposable用のusingによるtry{}finally{}が紹介されたことも

https://blogs.msdn.com/b/powershell/archive/2009/03/12/reserving-keywords.aspx

まぁこれ、v2はともかくv5.0では使えないんですけどね!

https://gist.github.com/guitarrapc/0ebd8c1c54aabc7e610c

PoweShell 5.0 で搭載される using シンタックス

usingときくと、C# では名前空間の宣言やリソース破棄がパッと思い浮かびます。PowerShellでも何の機能を持たせるかいくつか議論があったのですが、搭載されたのは名前空間の宣言です。

とはいえ、about_Language_Keywordsにはないずさんさです。

https://technet.microsoft.com/ja-jp/library/hh847744.aspx

さらに、WMF 5.0のリリースノートにもないというアンドキュメント感たっぷり。

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

どんな感じで使うのか

スクリプトの上部で以下を宣言してあげれば、以降は宣言されたクラスの名前空間が省略可能になります。

using namespace <名前空間>;

例えばList がPowerShell 4.0までこう書く必要があったのが、

New-Object "System.Collections.Generic.List[int]";
New-Object "System.Collections.Generic.Dictionary[[string], [string]]";

一度名前空間を宣言しておけば、List[int]で済むのは幸せでしょう。

using namespace System.Collections.Generic;
New-Object List[int];
New-Object Dictionary[[string], [string]];

あ、PowerShell 4.0まではこういう紹介ありますけど、私はあまり好きじゃないです。どうしても必要と感じた時以外は使いません。

https://qiita.com/stofu/items/eac46f6a4bb4797cc8c9

using namespace のサンプル

クラス構文とファンクション構文それぞれで利用できますが、クラス構文の返戻値の型宣言には使えないので気を付けてください。

https://gist.github.com/guitarrapc/e092ffb40e06fec40216

それぞれこんな感じで帰ってきます。

クラス構文

Adding list 0. Elapsed time 7.3973ms
Adding list 1. Elapsed time 14.068ms
Adding list 2. Elapsed time 14.5463ms
Adding list 3. Elapsed time 14.9423ms
Adding list 4. Elapsed time 15.5296ms
Adding list 5. Elapsed time 15.8406ms
Adding list 6. Elapsed time 16.1545ms
Adding list 7. Elapsed time 16.4804ms
Adding list 8. Elapsed time 16.8308ms
Adding list 9. Elapsed time 17.1498ms
Final elapsed time 19.3839ms
0
1
2
3
4
5
6
7
8
9

ファンクション構文

Adding list 0. Elapsed time 10.4587ms
Adding list 1. Elapsed time 37.9896ms
Adding list 2. Elapsed time 79.5513ms
Adding list 3. Elapsed time 94.0689ms
Adding list 4. Elapsed time 96.9513ms
Adding list 5. Elapsed time 97.2735ms
Adding list 6. Elapsed time 97.6232ms
Adding list 7. Elapsed time 97.9385ms
Adding list 8. Elapsed time 98.3093ms
Adding list 9. Elapsed time 98.6885ms
Final elapsed time 99.0148ms
0
1
2
3
4
5
6
7
8
9

クラス構文早い (そこ

まとめ

アンドキュメントとはいえ、Windows 10で搭載された以上は消えることはないでしょうから使っちゃいましょうかね。

PowerShell 5.0からはジェネリクスの宣言はつらくなくなりそうでよかったです。