tech.guitarrapc.cóm

Technical updates

PowerShell Cmdlet のデバッグとかなんとか

最近は、もっぱら RespClient がお気に入りで欲しいと思ったものをちょいちょい追加しています。

Cmdlet なので、VS で C# となります。

PowerShell ISE での function デバッグといえば、まぁごにょごにょ。

これが、Cmdlet となるとどうやるのかをちらっと見てみましょう。

目次

手順

いたってふつーです。

  1. Cnmdletを書く
  2. ビルドした dll をてきとーに配置
  3. PowreShell.exe を開く
  4. VS でプロセスをアタッチ
  5. Import-Module .\dllの名前.dll でモジュールをインポート
  6. ブレークポイントをテキトーにはってCmdletを実行

これで、VS内で設定したブレークポイントで停止、デバッグが可能になります。

Cmdlet を書く

書いてください。

ビルドしたdll をテキトーに配置

はい、てきとーです。

f:id:guitarrapc_tech:20140904060432p:plain

PowerShell.exeを開く

dll のパスで、File > Open PowerShellが楽でしょう。

f:id:guitarrapc_tech:20140904060545p:plain

VS でプロセスをアタッチ

PowerShell.exe を開いたら 開いたPowerShell プロセスを VSにアタッチしましょう。

f:id:guitarrapc_tech:20140904060620p:plain

f:id:guitarrapc_tech:20140904060645p:plain

これでみんな大好きウォッチ式も使えます。

f:id:guitarrapc_tech:20140904060733p:plain

.dll からモジュールをインポート

.dllと同一パスでPowershell.exe を開いていれば簡単でしょう。

Import-Module .\RespClient.dll

f:id:guitarrapc_tech:20140904060900p:plain

ブレークポイントをテキトーにはってCmdletを実行

VS でテキトーにブレークポイントを貼ります。

f:id:guitarrapc_tech:20140904061031p:plain

PowerShell.exe でCmdletを実行しましょう。

VSで張ったブレークポイントにフォーカスが遷移して止まったはずです。

f:id:guitarrapc_tech:20140904061224p:plain

ローカルも、ウォッチ式も使えますねー。

f:id:guitarrapc_tech:20140904061328p:plain

f:id:guitarrapc_tech:20140904061347p:plain

あとは、F10 や F11 など、ステップイン/アウトを使ったりブレークポイントをずらしたりしてはかどってください。

注意点

Add-Type などで気づかれている方も多いかと思いますが、PowerShell.exe や PowerShell ISE は、そのプロセスでインポートしたモジュール.dll やスナップインとして読み込んだ.dll をハンドルしっぱなしになります。

そのため、ビルドしなおして dllを再配置使用としたらファイルロックと怒られたりします。 えー、やだー

PowerShellスクリプトで書いた、スクリプトモジュールはハンドルしないのにふぇぇです。

そのため、「一度 .dll を読み込んだら、プロセスを終了しないと .dll がハンドルされる」ことを覚えておいてください。うざいですね。

Roslyn や .NET Native 、 vNext などが出て来たら改善するんでしょうか? *1

まとめ

VS のデバッグは、間違いなく ISEよりはかどります。

PowerShell Script を ISE や VSで書くよりもはかどったりするので、ぜひぜひどうぞ。

*1:いやしないだろう