tech.guitarrapc.cóm

Technical updates

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

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

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

gist.github.com

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

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 がずっとあったのです。

言語仕様でも

Download Windows PowerShell Language Specification Version 3.0 from Official Microsoft Download Center

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

about Reserved Words - PowerShell | Microsoft Learn

将来のためってことで。

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 では使えないんですけどね!

gist.github.com

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

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

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

about_Language_Keywords | Microsoft Learn

さらに、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 まではこういう紹介ありますけど、私はあまり好きじゃないです。どうしても必要と感じた時以外は使いません。

qiita.com

using namespace のサンプル

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

gist.github.com

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

クラス構文

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 からはジェネリクスの宣言はつらくなくなりそうでよかったです。