hmPS (秀丸マクロ用 PowerShell)
秀丸マクロで「PowerShellの多くの機能をシームレスに近い形で利用する」ためのライブラリとなります。
PowerShellは、Windows 10以降では「標準コンソール」であり、
「(テキストではなく)オブジェクトがベース」というかなり先進的なコンソールとなっています。
PowerShellは、そもそも.NET Frameworkで構成されており、
その変数やオブジェクトも全て.NETのなんらかの型に基づいています。
PowerShellのコマンドをユーザーが作成する場合でも、基本的には.NET Frameworkで作成します。
もちろん、旧来の「テキストを受け取り、テキストを出力する」といった古いタイプのコンソールアプリケーションもシームレスに動作するようになっています。
秀丸マクロとPowerShellの連携
HTMLにJavaScriptを埋め込むような感覚で、秀丸マクロにPowerShellを文字列として埋め込むことが出来ます。
複数個所に埋め込んでも、記述の内容は持続性を持っています。
又、HTMLに対するJavaScript同様に、マクロ中に埋め込むのではなく、Psファイルとして独立したファイルに記述してもかまいません。
ダウンロード
動作環境
-
秀丸
秀丸エディタ ver8.73以上
-
PowerShell
PowerShell は ver5以上が対象となります。
-
Microsoft VC++ 再頒布可能パッケージ
Visual Studio 2017 C++ ランタイム
x86版をインストールしたことが無い方はインストールしてください。
お手持ちのOSが64bitか32bitかには関わりなく、x86版のインストールが必要です。
-
Microsoft .NET
.NET Framework 4.5以上。
-
秀丸エディタ 64bit版について
秀丸エディタ64bit版をご利用の方は、hmPS_x64.zipをダウンロードし、hmPS.dllを差し替えてください。
(又、この場合は、Microsoft VC++ 再頒布可能パッケージは、64bit版をインストールしてください。)
-
秀丸エディタ ストアアプリ版について
hmPSはストアアプリ版でも利用することが出来ます。詳細は左メニューのストアアプリ版での利用などを参照してください。
インストール
- hmPS.zipを解凍する。
-
「hmPS.dll」と「hmPS.ps1」の2つのファイルを秀丸エディタのディレクトリ内(hidemaru.exeと同じ場所)へと コピーする。
(
原則的には、hidemaru.exeと同じ場所である必要があります。これは.NET FrameWorkのdllを動作させる仕組みに拠るためです。)
利用シーン
-
PowerShellのコマンド・コンソールコマンド・.NETのAPIの機能をシームレスに!!
PowerShellは、「コマンド系」としての性質と「.NETライブラリを使えるスクリプト」という2つの顔を持っています。
- 文字列処理
- ウィンドウズの各機能へのアクセス
- 各種GUIコンポーネントやイベントハンドラ
- インターネット上のデータの取得
- 各種ファイル処理
- 並列スレッド
- 簡易な数学計算
に至るまで、.NET Frameworkをシームレスに利用しながら、処理を記述することが可能です。
-
秀丸エディタ 8.66 以降では、PowerShellをそのままマクロ内に記述出来る!!
秀丸エディタ 8.66にて、「ヒアドキュメント」が実装されたため、
PowerShellをそのままマクロ内に記述出来るようになりました。(エスケープ等の必要性がなくなりました!)
詳細は後述されています。
-
PowerShellから秀丸マクロの変数やシンボルにアクセス出来る!! 秀丸マクロも実行できる!!
この機能により、「秀丸マクロならでわの機能」と「PowerShellの機能」が融合し、飛躍的に実装の幅が広がりました。
OS標準のシェルスクリプトであるという安心感
-
hmV8やhmPyといったものと比べると言語自体は劣る
ES6+.NETとなるhmV8や、IronPythonをベースとしたhmPyなどと比べると、
言語それ自体の成熟度はやや落ちます。
しかしながら、「今後浸透が確実な、Windows OS標準の、コンソールコマンド兼スクリプト」という独特な立ち位置は、
「2030年ぐらいまではまず安泰。使えなくなる可能性が極めて低い」といった安心感があります。
-
C#で独自に制作した.dllが読み込みしやすい
元々用意されている.NETのクラスのみならず、
独自に自作したマネージドの.dllがPowerShellでは使いやすくなっています。
又、「PowerShell用途に適したC#等によるコマンドレットの作り方」もMicrosoftが提供しています。
-
1つのdllで動作する!!
hmPS.dllだけで動作します。
又、秀丸マクロと同じプロセス空間(インプロセス)で動作していますので、ガッチリ秀丸と完全連携します。
ファイルの文字コード
hmPSは「秀丸マクロ」「.psファイル」共に
「utf-8(BOM有)」もしくは「utf-16(BOM有)」で記述することを想定
しています。
(.psファイルに限っては「utf-8(BOM無)」にも対応しています。)
「w付き」関数を利用のこと
「dllfuncではなく、必ず「dllfuncw」を、dllfuncstrではなく、「dllfuncstrw」を使ってください。
注意点
-
"PowerShellは「それぞれのプロセスでの最初の起動」がとても遅いです。
よって、何か「既存のPowerShellの資産の流用」や「PowerShell以外のスクリプト記述方法がどうしても分からなかった」といった場合を除き、
普段使いでは、hmV8、hmJS、hmPython3、hm.NET、hmPeachなどの使用をオススメします。
秀丸マクロと同じ関数や(関数のような)文のほとんどが同名で用意されている。
.NET Frameworkが使える
「秀丸マクロ・マクロ変数」「PowerShell」「.NET Framework」をまぜこぜに出来るため、非常に強力なパワーがあります。
-
.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);
-
.NET FrameWorkを使って、秀丸とインタラクティブに機能するフォームの例
#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);