Power ShellをSciTEから実行する

ふとしたきっかけでPowershellに興味を持ったはいいが、どうにもあの、コマンドプロンプトのインターフェースが気に食わなくて、なんか適当なテキストエディタでもないものだろうかとネットを探し回ったのは私だけではないだろう。幸いなことにも私のお気に入りであるSciTEは現地点の最新版である1.76でPowershellに対応している*1。しかし、ダウンロードして使ってみるとある根本的な問題に直面する。キーワード、シンタックスのハイライトは何もしなくても自動的に設定されるだろう。オートコンプリートは2008年1月28日のポストを参考に、propertiesファイルからAPIファイルを作成し、Propertiesファイルに以下を追記すればいい。

api.$(file.patterns.powershell)=$(SciteDefaultHome)\api\ps1.api;
autocomplete.powershell.ignorecase=1
autocomplete.powershell.start.characters=$(chars.alpha)$(chars.numeric)$

と、ここまではいい。問題はこの先。簡単なスクリプトを書いて、F5を押してみると、「あれ?」 スクリプトが実行されないのである。それはそうだ、PowershellのPropertiesファイルには「command.go.*.ps1=」すなわちF5を押した時に実行されるプログラムについての記述が無いからだ。しかしSciTEほどのテキストエディタが何故にこのような中途半端なことを? とりあえず思いつきで以下のような行を追加してみたり、試行錯誤を繰り返し、Powershellの仕様を調べてみたりしてようやく、SciTEから直接Powershell Scriptを呼ぶことが「不可能」であることに気付くのだ。

#ブッブー、そもそもPowershellにはこんな引数の取り方が無い
command.go.*.ps1=Powershell "$(FilePath)"

これはMicrosoft様のセキュリティに対する熱い思いのためで、いずれのスクリプトの実行ポリシーであろうと、ワンボタンでスクリプトを実行できてしまうようなヤバいことはさせてたまるか、ということらしい。ついでに言うとPowershell自身、インストール直後そのままではスクリプトの実行を拒否る習性を持っている。この習性を直してやるには、以下のコマンドをPowershell上で実行する必要がある。

Set-ExecutionPolicy RemoteSigned

しかしそれでも、依然サードパーティのソフトウェアからワンボタンで実行するようなことは許してくれない。あー面倒くせぇ。そろそろPowershellを使うこと自体投げ出しそうだ。しかしもう少しねばってみると希望の光が見えてくる。cmd.exe上で以下のコマンドを実行してみるのだ(ファイル名は要書き換え)。

powershell -command "c:\temp\test.ps1"

こうするとpowershell上のコンソールと使わなくともパワーシェルスクリプトが実行できる。段々と答えへ近づいてきた。

# これで終わりだ!?
command.go.*.ps1=cmd /C powershell -command "$(FilePath)"

そしてまた落胆…。だからMS様は言ったじゃあないか、ワンボタンでスクリプトが実行されるようなことは許さないと。しかし一寸待って、さっきcmd.exeからスクリプトが実行できたよね。っていうことは逆に、「cmd.exeを乗っ取りさえすれば、好きなスクリプトが実行できる」ってことだ! cmd上で任意のコマンドを実行し、cmdのSTDOUTを読み、それを自身のSTDOUTに出力する簡単なプログラムさえあればいいということ。この程度のことならAutoItで余裕だ。
psrun(ソース付属)
このpsrun.exeをSciTEのインストールディレクトリへコピー後、powershell.propertiesのケツに以下一行を追記する。

command.go.*.ps1=psrun.exe "$(FilePath)"

あとは.ps1スクリプトを開き、F5を押すだけだ! ハッハー!

*1:注:AutoIt3.2.12.1付属のSciTEは1.76であるがPowerShellには対応していない。wscite176.zipをダウンロードしpropertiesファイルのコピー、SciTEGrobal.properliesの編集を行う必要がある。