秀丸マクロで「PowerShellの多くの機能をシームレスに近い形で利用する」ためのライブラリとなります。
PowerShellは、Windows 10以降では「標準コンソール」であり、
「(テキストではなく)オブジェクトがベース」というかなり先進的なコンソールとなっています。
PowerShellは、そもそも.NET Frameworkで構成されており、
その変数やオブジェクトも全て.NETのなんらかの型に基づいています。
PowerShellのコマンドをユーザーが作成する場合でも、基本的には.NET Frameworkで作成します。
もちろん、旧来の「テキストを受け取り、テキストを出力する」といった古いタイプのコンソールアプリケーションもシームレスに動作するようになっています。
HTMLにJavaScriptを埋め込むような感覚で、秀丸マクロにPowerShellを文字列として埋め込むことが出来ます。
複数個所に埋め込んでも、記述の内容は持続性を持っています。
又、HTMLに対するJavaScript同様に、マクロ中に埋め込むのではなく、Psファイルとして独立したファイルに記述してもかまいません。
秀丸エディタ ver8.73以上
PowerShell は ver5以上が対象となります。
Visual Studio 2017 C++ ランタイム
x86版をインストールしたことが無い方はインストールしてください。
お手持ちのOSが64bitか32bitかには関わりなく、x86版のインストールが必要です。
.NET Framework 4.5以上。
秀丸エディタ64bit版をご利用の方は、hmPS_x64.zipをダウンロードし、hmPS.dllを差し替えてください。
(又、この場合は、Microsoft VC++ 再頒布可能パッケージは、64bit版をインストールしてください。)
hmPSはストアアプリ版でも利用することが出来ます。詳細は左メニューのストアアプリ版での利用などを参照してください。
PowerShellは、「コマンド系」としての性質と「.NETライブラリを使えるスクリプト」という2つの顔を持っています。
に至るまで、.NET Frameworkをシームレスに利用しながら、処理を記述することが可能です。
秀丸エディタ 8.66にて、「ヒアドキュメント」が実装されたため、
PowerShellをそのままマクロ内に記述出来るようになりました。(エスケープ等の必要性がなくなりました!)
詳細は後述されています。
この機能により、「秀丸マクロならでわの機能」と「PowerShellの機能」が融合し、飛躍的に実装の幅が広がりました。
ES6+.NETとなるhmV8や、IronPythonをベースとしたhmPyなどと比べると、
言語それ自体の成熟度はやや落ちます。
しかしながら、「今後浸透が確実な、Windows OS標準の、コンソールコマンド兼スクリプト」という独特な立ち位置は、
「2030年ぐらいまではまず安泰。使えなくなる可能性が極めて低い」といった安心感があります。
元々用意されている.NETのクラスのみならず、
独自に自作したマネージドの.dllがPowerShellでは使いやすくなっています。
又、「PowerShell用途に適したC#等によるコマンドレットの作り方」もMicrosoftが提供しています。
hmPS.dllだけで動作します。
又、秀丸マクロと同じプロセス空間(インプロセス)で動作していますので、ガッチリ秀丸と完全連携します。
hmPSは「秀丸マクロ」「.psファイル」共に
「utf-8(BOM有)」もしくは「utf-16(BOM有)」で記述することを想定
しています。
(.psファイルに限っては「utf-8(BOM無)」にも対応しています。)
「dllfuncではなく、必ず「dllfuncw」を、dllfuncstrではなく、「dllfuncstrw」を使ってください。
「秀丸マクロ・マクロ変数」「PowerShell」「.NET Framework」をまぜこぜに出来るため、非常に強力なパワーがあります。
#PS = loaddll( hidemarudir + @"\hmPS" ); #_ = dllfuncw( #PS, "DoString", R"PS( [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $test = "表示" if ($test -match "^表.+") { [Windows.Forms.MessageBox]::Show( "秀丸からのメッセージ", "秀丸からのタイトル", [Windows.Forms.MessageBoxButtons]::YesNoCancel ) } )PS" ); freedll(#PS);
#PS = loaddll( hidemarudir + @"\hmPS" ); #_ = dllfuncw( #PS, "DoString", R"PS( [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") class MyForm { [int] $counter; [System.Object] $form [System.Object] $btn SetForm() { $this.form = New-Object System.Windows.Forms.Form; $this.form.Text = "こんにちわ"; } SetButton() { $this.btn = New-Object System.Windows.Forms.Button; $this.btn.Text = "クリック"; $this.btn.Left = 16; $this.btn.Top = 16; $this.btn.Width = 100; $this.btn.Height = 40; $this.btn.Tag = $this; # イベントハンドラも作れる $this.btn.Add_Click({ ($sender, $event) = ($this, $_); btn_Click($sender, $event); }); $this.form.Controls.Add($this.btn); } Show() { $this.counter = 0; $this.SetForm(); $this.SetButton(); $this.form.ShowDialog(); } } function btn_Click($sender, $event) { $sender.Tag.counter++; # デバッグモニター用の関数 $hm::debuginfo("ボタンが押されたよ!!"); $hm::debuginfo($sender.Tag.counter); # 秀丸マクロの「変数」とのやりとりも自由自在 ($filename2) = $hm::Macro::Var['filename2']; $hm::debuginfo($filename2); # 秀丸マクロの「変数」とのやりとりも自由自在 $hm::Macro::Var['$counter'] = [string]$sender.Tag.counter # PowerShellの中から秀丸マクロを一連のコマンドとして実行することも出来る。 # PowerShellには「ヒアドキュメント」が使えるのでちょうどよい $hm::Macro::Eval( @' // アウトプット枠へ出力 #OP = loaddll("HmOutputPane.dll"); #ret = dllfunc(#OP, "Output",hidemaruhandle(0), $counter); freedll(#OP); '@ ); } $f = New-Object MyForm; $f.Show(); )PS" ); freedll(#PS);
hmPSは、Apache License 2.0となります。