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 をテキトーに配置

はい、てきとーです。

image

PowerShell.exeを開く

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

image

VS でプロセスをアタッチ

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

image

image

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

image

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

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

Import-Module .\RespClient.dll

image

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

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

image

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

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

image

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

image

image

あとは、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:いやしないだろう