ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

PowerShellでジェネリックス!

またPowerShellの記事ですが、今回はいつものように長々と書くのではなく、当ブログではすごく久しぶりにメモ程度の記事です。

…と思っていたら、またまた長くなってしまった。
短くまとめられる能力が欲しいですね。


PowerShellでは型を意識しない書き方をできるようになっていますが、ジェネリックスを相手にする場合は型を明示しなければなりません。

そこで、今回はジェネリッククラスとジェネリックメソッドをどのように呼び出せばよいか書きます。

実は私も昔、何回か気にした問題なのですが、その度に忘れるので今回こそメモします。



ジェネリッククラス

まず知っていただきたいのは、型引数をn個持つジェネリッククラスは、PowerShellにおいて本当の名前はその型名に'`n'をくっつけたものであるということです。

つまりは、'System.Collections.Generic.List<T>'とC#で呼ばれているものは、PowerShellでは'System.Collections.Generic.List`1'になって、
'System.Collections.Generic.Dictionary<TKey, TValue>'なら、'System.Collections.Generic.Dictionary`2'となります。


しかし実際のところPowerShellでは、型名を書いたあと型引数を続けて書かなければならないので、そこから推論することが可能です。
つまりは、この数字を後につけることは、あまりないと思います。


静的クラス

まずは静的メンバにアクセスするために、ジェネリッククラス名を書く場合の方法です。
まず型名を[]で囲むわけですが、さっき実験して驚いたことがありまして、

PowerShellの以前のバージョンでは型名を[]で囲んだものを書いてエンターを押しても、別にメソッドを呼んでいるわけでもないのでエラーになっていました。

しかし、先ほどv5.0で実験してみたところ、[]で囲んだ型名だけでも、それはSystem.Typeのインスタンスとして解釈されるようになったようです。

そして[]の後に書く::は、左の[]と結びついている記号じゃなくなり、
左のSystem.Typeが表す型に定義されている静的メンバにアクセスする記号という意味に変わったということです。

これが何を意味するかというと、

$type = '文字列'.GetType()
$type::FullName


こういう変数を介したアクセスが可能になったということです。


さて、本題に戻しますが、要するに話はジェネリッククラスのSystem.Typeをどのように作るかという問題になります。

これは、すごく単純に、まず型名を書いて、そのあと任意で前述の'`n'を付加します。

そして、そのあと[]を付加して、この中に型引数を書きます。
型引数が複数あるなら、','で区切ります。

そして、この時点で型名を書くことができたということになるのですが、ここからSystem.Typeを作るために、全体を[]で囲みます。

よってたとえば、'[System.Collections.Generic.List[string]]'とか、'[System.Collections.Generic.Dictionary[int,string]]'ということになります。

あとは::を書いて普通にメンバ名を書くだけです。

スポンサーサイト



続きを読む

tag: PowerShell スクリプト クラス メソッド ジェネリックス 文法 推論

PowerShellでクラス定義!

PowerShellの記事を結構、書きそうなので「PowerShell」カテゴリを作りました。

C#」カテゴリはまだ3件しか記事を書いてないんですね。

そういえば余談ですが、C# 6.0の新機能を調べてみたらあんまり面白いものがありませんでした。

C#はもう、これ以上いじったら最初のものと離れすぎるし、そろそろ保守的な時期に入ったのでしょうかね。

それに比べ、PowerShellのこの頃の進化はヤバイです。


Windows10ではBashが使えるようになるらしいですね。
Ubuntu互換のシステムを搭載して、その上でLinux用のBashをそのまま動かすみたいです。

私はBashがどんなものなのかよく知らないのですが、すごく喜ばしいことのようです。

Bashって便利なんですかね。
PowerShellもなかなか便利だと思うんですけどね。

というか、PowerShellのほうが全然新しいでしょうし、オブジェクトのパイプラインもあるし、

PowerShellは一行のコマンドを書くのも、大きなスクリプトを書くのも柔軟に対応できるし、PowerShellのほうが本当は凄いんだと思います。


「WindowsのCUI環境はクソだ」とよく言われますが、それはコマンドプロンプトのほうだけ見ての意見なんじゃないでしょうか。

私はコマンドプロンプトのほうは使えないので、コマンドプロンプトが如何ようにクソなのか存じ上げませんが…。


まあ、Linuxなど他社の技術との親和性を求める人はWindows上でもBashを使うようになると思うので、
PowerShellには、もうふっきれて、親和性度外視でオレ仕様を作りまくってほしいですね。

私はせっかくPowerShellを覚えたので、PowerShellについていきたいと思います。

続きを読む

tag: PowerShell スクリプト CUI クラス メソッド 継承 オブジェクト指向 ダックタイピング

PowerShellでWPFとかイベントとか ~ 枠組みをC#で書く ~

この頃、ブログの更新がおろそかでしたが、ネタはあったのです。

今回は大したものではないですが、この前書いた記事「PowerShellで.NETのウィンドウを生成する」の続編的な内容を綴りたいと思います。

そのため、あちらの記事を読んでからこちらを読むこと推奨です。

最近、昔の記事と同じネタを使いまわすばっかりで、やっぱりネタないんだろとか言ってはいけない。



上記リンクの記事では、ウィンドウの生成と表示までをメインに書いてあり、
ボタンを押したら〇〇するみたいなイベントハンドラというかロジックの部分はかなり適当でした。


一応、前にイベントハンドラについて言及したことをまとめましょう。

XAMLでたとえば、Windowの要素としてButtonがあるというときに、PowerShell上でButton.Clickイベントのハンドラを書きたいなというときは、

まず、PowerShellでButtonのインスタンスを取得できるようにするため、XAMLのほうでButton要素に適当なx:Name属性を設定しておきます。

そして、Windowのインスタンスはすでに例のXamlReader.Parseメソッドから取得できているので、
そのWindowのFindNameメソッドにButtonのx:Nameを与えればインスタンスを探して返してくれます。


そして、そのインスタンスのメンバに、PowerShell専用の普段は使えないメソッドですが、Add_(イベント名)というメソッドがあるので、それを呼びます。

引数に { ... } と書くスクリプトブロックを与えれば、たとえばAdd_Clickを呼んだなら、そのあとボタンがクリックされたときにスクリプトブロックが呼ばれるということになります。

ちなみにAdd_(イベント名)じゃなくて、Register-ObjectEventというコマンドレットでもPowerShell的なスタイルでイベントハンドラを登録できるのですが、
これは厳密にいうとイベントハンドラとはちょっと違うPowerShellのジョブというものであるようで、実験してみたところおそらくジョブを扱うスレッドはGUIスレッドと違うという問題で上手いことハンドラが呼ばれませんでした。



このように、
1. XAMLにx:Nameを書いておく
2. FindName
3. Add_(イベント名)
と、三つの工程を踏まなければならないので、イベントを登録するコントロールがひとつならいいですが、たくさんあるともう大変です。

つまりイベントハンドラがたくさんあるような本格的なGUIを、PowerShellから構築することは考えないほうがいいでしょう。

続きを読む

tag: Windows PowerShell C# イベント WPF XAML テンプレート スクリプト

PowerShellで.NETのウィンドウを生成する

ずっとブログのトップ記事がギャラリーになっていて、もう鏡開きなのでそろそろ普通の記事を出さないといけないと思っていたのですが、

なにしろネタがありませんでして、更新するにも出来ない状態だったのですが、今日は例によって祝日ではありませんか。

祝日は更新しなければならないという謎の使命感が今宵もクソ記事を生み出します。


最近、PowerShellを触っていたわけでもないのですが、ネタをひねり出した結果、PowerShellの記事を書くことにしました。


PowerShellでは.NET Frameworkのライブラリをコールできるので、もちろんWindows FormsやWPFなどGUI用のライブラリも使用できます。

これを使って、PowerShellからウィンドウを生成して表示することができるわけでして、
GUIで使える使い捨てツールを作りたいときとかいいんじゃないかと思いましたので、その方法について簡単に紹介していきます。


まあ、GUIで使える使い捨てツールは、記事「シェルスクリプトとかExcelとか」で書いたように、Excelで作るのもなかなかよい選択なんじゃないかと思ったりもしますけどね。


それでも今回はPowershellと.NETで、
・Windows Forms
・WPF(コード)
・WPF(XAML)
の三編でお送りします。

おまけとしてイベントハンドラについても述べます。
続きを読む

tag: PowerShell プログラム GUI WindowsForms WPF XAML スレッド イベント

シェルスクリプトとかExcelとか

書くことがないのですが、そろそろ更新しないとアレなので、クソ記事生産します。

さて、プログラミングが出来るようになると、パソコンでの単調な作業とか計算の繰り返しを自動化させられるようになるわけですが、
C#とかだといちいちVisual Studioを起動させて、プロジェクト作って、書いて、みたいに面倒です。

コマンドラインからコンパイルできますが、それもむしろ余計に面倒ですね。

なのでやっぱり、素早く記述して実行まで持っていけるスクリプト言語を使えるようになることは価値のあることだと思います。


スクリプト言語といえば、WindowsならWSHでJavaScript(JScript)とVBScriptがサポートされていますね。

JavaScriptは汎用性が高くていいと思いますが、汎用性が高いがゆえにWindows固有の操作とかはCOMオブジェクト頼りになってしまいます。

ようするに面倒ですね。

そこでシェルスクリプトです。

シェルというのは、まさにOS固有の操作をするためにあるものなので、シェルに対する命令をスクリプトにできたら最高ではないですか。

もちろん普通にバッチとかありますけど、Windowsではより新しいものにPowerShellがありますね。

PowerShellは、私も詳しいわけではないですが、設計思想が新しめで、.NET Frameworkとの連携が深いところにも強みがあります。

というわけでPowerShellを使いこなせるようになりたいと思ったりしています。

いや、随分と前からそう思っていたので、ちょくちょく勉強しているんですけどね。


上記のように自動化というと基本的にはCUIとかテキストベースですが、Windowsにはさらにもうひとつ面白いものがあります。

Excelというのは、GUIで何でもできます。
単純計算も視覚的に可能です。

ExcelというのはGUIのスクリプト言語みたいなものなんじゃないかと思うわけです。

プログラマはExcelに対していつも「それコード書けばよくねw」みたいに、Excelを小馬鹿にしたような態度を取りますが、
プログラマの観点から見ても、GUIで自動化をできるExcelという存在は一目置くべきではないでしょうか。

まあ、私もExcel詳しくないですが…。
Excelも使いこなせるようになれば、なかなか便利だと思います。

ただ、一つ言うと、設計が古いことと、データ型などのプログラミング言語的な要素を軽視していることが、プログラマを遠ざけていると思いますね。

いや、よく知りませんが…。

一度、プログラミング言語との親和性も高くして新しいExcel的なものを作りなおせば、GUIのスクリプト言語としての需要が高まるのではないでしょうか。


と思っただけの記事です。
これぞクソ記事という感じですが。

tag: Windows Excel GUI PowerShell シェル スクリプト バッチ 自動化

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。