tech.guitarrapc.cóm

Technical updates

PowerShell Script の エディタ と Visual Studio

PowerShellスクリプトを書く時のエディタには、いくつか人気のものがあります。

  • PowerShell ISE
  • Visual Studio
  • PoweGUI

PowerShell Plus や いくつか他にも利用者がいるものはあるのですが、いずれも完成度が上記より低い印象が強いため、3つに絞っています。*1

いずれもインテリセンスやコードハイライト、REPL環境が当然ついています。

エディタを選択する時、多くの方にとっては

  • 問: PowerShell Script/Module を書くときのエディタは?
  • 答: PowerShell ISE

かもしれません。しかし私の場合は Visual Studioとなります。

ではなぜ PowerShell Script/Moduleを Visual Studio で書くのか、ISE との違いを見てみましょう。

PowerGUI は、あ、察し。

目次

PowerShell ISE

Windows 7 以降標準で搭載されている ISE - 統合スクリプト環境 *2 です。

PowerShell v3 からはその見た目も進化して使いやすくなっています。

読み方は、ISE => アイス です。

メリット

いくつか考えてみましょう。

  • OS標準
  • コード補完とインテリセンス
  • コードハイライト
  • モジュールによる機能拡張
  • RunSpace の分離
  • Snippet の拡張
  • リモート処理のメニュー化
  • デバッグ機能

つまり、 OS標準で使えて モジュールやプロファイルでの拡張、標準の拡張機能が優れている。これが最大のメリットです。当然ですが、新しいバージョンのPowerShell にも対応しており、例えば DSC キーワードやインテリセンスも最も対応できています。

完成度も高く、Windows 7/2008 R2以降ならどこでも使えるので、PowerShell を初めて使う人にとっても、慣れた人にとってもお世話になるでしょう。

コード補完とインテリセンス

なしにはコーディングできませんね。メモ帳とかムリポ。

関数や変数、型などで、Tab を押すと既知のものは自動的にコード補完されます。

インテリセンスは、 Verb-Noun の- タイミングか Ctrl + Space で表示されます。

Powershell.exe にはコード補完はあっても、インテリセンスでのヒントはないのでつらいです。

PowerShellは入力文字が長い?コード補完もインテリセンスも使ってないことがバレバレなので出直しましょう。インテリセンスを前提としているのです。

f:id:guitarrapc_tech:20140929092834p:plain

コードハイライト

Cmdlet/Function と変数、型、文字列など、それぞれをASTから解析して色で表示してくれます。今時ないとかありませんね。

f:id:guitarrapc_tech:20140929093335p:plain

モジュールによる機能拡張

特にモジュールによる機能拡張は素晴らしいです。Script Browser や ISE Steroidsを使うと見違えるほど化けます。過去記事があるので参照してみてください。

他にも、Tabの拡張を行うTabExpansionPlusPlusを入れるとWMIも使いやすくなるのでもう素晴らしいですね。これはコンソールでも使えるのでオススメです。

Profile の編集もメニューからできるので便利でしょう。

f:id:guitarrapc_tech:20140929091814p:plain

RunSpace の分離

Ctrl + t で、PowerShell の実行空間 (RunSpace) を新たに生成できるので、新しいモジュールのロードやテストも捗ります。

PowerShell のモジュールやDll は、プロセス内部の RunSpace毎にインポートされています。RunSpaceを新たに生成するということはISE を再起動することなくクリーンな環境で再開できることを意味するのです。これはモジュール開発時に、テストが終わってから、初期状態に読み込んで実行を繰り返す時には便利です。

f:id:guitarrapc_tech:20140929091735p:plain

Snippet の拡張

Ctrl + j で、スニペットが使えます。ISE では、容易にスニペットも拡張できるのでコーディングが楽になるでしょう。Advanced Function や DSC も スニペットで簡単に書くことができます。

f:id:guitarrapc_tech:20140929092229p:plain

スニペットは簡単に拡張できるように関数が用意されていますし、ラッパー作ればもっと簡単に利用もできます。

f:id:guitarrapc_tech:20140929092647p:plain

リモート処理のメニュー化

なんのことはない、Enter-PSRemoting がメニューから選べます。私は使ったことありませんが!

f:id:guitarrapc_tech:20140929092402p:plain

f:id:guitarrapc_tech:20140929092411p:plain

デバッグ機能

ふつうです。デバッグできます。

f:id:guitarrapc_tech:20140929094017p:plain

デメリット

正直、機能足りません。

  • 複数ファイルの処理
  • テスト連動
  • デバッグ機能の貧弱ぶり

一定の大きさになってくるとよくわかります。

複数ファイルの処理

スクリプトモジュール (.psm1) がそうですが、1つのファイルにすべての関数を記述するのは見通しも悪く辛いものがあります。そこで、関数ごとにファイルを分割したりするのです。

ただし、ISE はファイルごとにタブを作るのみで、モジュールとして一纏めのプロジェクト管理などはできません。横断的にファイルをみたり編集できないのです。

これはかなりの苦痛です。

あ、現在のファイルに存在する関数は、ISESteroids を使えば見れるのでオススメです。

f:id:guitarrapc_tech:20140929093821p:plain

正直 ISESteroids がないと、つらすぎますね。

テスト連動

しょうがない部分もあるのですが、現在主流となっているPowerShell における Unit Test、 Pester や Psate と連動できません。

別途テストを走らせるのはめんどくさいです。

デバッグ機能の貧弱ぶり

変数見せてよ。お願い。ISESteroids を入れれば一応見れます。

総括

さくっと使うにはいいです。ISESteroids を入れてやっとまともになる印象です。

なので、接続先のWindows Server 2012 R2 でさくっと書いたり編集するには、オススメです。OS標準は強力です。

Visual Studio

標準では Visual Studio は PowerShell をサポートしていません。

Visual Studio User Voice でも Visual Studio Editor Team からサポート計画はないことが明言されています。

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2315046-bring-powershell-support-to-the-editor

というわけで、VS Extension の PowerShell Tools for Visual Studio を使いましょう。

メリット

いくつか考えてみましょう。

  • VSの機能を使える(プロジェクトシステム)
  • NuGet
  • 独自の便利機能
  • テスト連携 ー 他言語ハイライト

VSの機能を使える(プロジェクトシステム)

すべてはここに集約します。

単純に PowerShell ISE より VS の方が機能を豊富に持っています。VSの機能全てではないにしても、Extension でその一部が活用できるのは強力にサポートしてくれます。

ISE で挙げたメリットの内、OS標準、RunSpaceの分離、Snippetの拡張、リモート処理のメニュー化以外はできます。

  • コード補完とインテリセンス
  • コードハイライト
  • モジュールによる機能拡張
  • RunSpace の分離
  • デバッグ機能

当然、REPL もついています。

f:id:guitarrapc_tech:20140929094929p:plain

プロジェクトシステムによって、モジュールを横断的に置換、検索などもできます。

f:id:guitarrapc_tech:20140929095136p:plain

ウィンドウ分割もいいですね。

f:id:guitarrapc_tech:20140929100134p:plain

他にも、VS の Extensionと連動できるのもよろしいかと。Productivity Power Tools も便利です。

NuGet

もちろん NuGet も使えるので依存パッケージも処理できます。これは強いです。

f:id:guitarrapc_tech:20140929095539p:plain

独自の便利機能

Extension には、いくつか便利な機能があります。特にReformat Script が便利です。

これを使えば、Alias の関数や型が完全名に修正されます。

例えばこれが、

f:id:guitarrapc_tech:20140929095932p:plain

こう

f:id:guitarrapc_tech:20140929100004p:plain

スクリプト内部でのAlias利用は基本よろしくないですが、どうしても使うものは使うので「さくっと完全名に修正される」のはとても大事です。

Reformat Script にあったバグ修正のPRを投げていたのですが、すんなりマージされたv1.0.3がリリースされているので、最新版を使ってください。

ブレークポイントとLocalsとCallStack

サポートしています。

ISE は標準では、変数に格納されている一覧を見れないので死にます。*3

https://i.imgur.com/hyG4766.png

https://i.imgur.com/4vKQ4CG.png

https://i.imgur.com/qa0iG0a.png

テスト連携

Pester と Psate Test Adaptersに対応しています。

https://i.imgur.com/eAXaKHV.png

他言語連携

当然ですが VS でエクステンションなどを含めて対応できる言語は全てコードハイライトなどの恩恵を受けれます。

PowerShell Script を書いていても、VSで書いていれば恩恵を受けれるのは大きいです。というのも、Add-Typeでは C# コードをそのまま入力できるので、書く機会はあるわけです。

あるいは、Cmdletを書いていて、一部だけ PowerShell Script という使い方。C# を書いていて、一部だけ PowerShell Script という使い方もありますね。

ISEでやって居る限りエディタの分割は避けられず、辛い思いをします。

デメリット

デメリットもあります。

  • OS標準ではない
  • RunSpace分離ができない
  • x86 PowerShell

まぁ、そのままです。はい。

特に x86 動作なのは VS に引きずられているのですが、DSC などは x64 限定なので DSC のコードハイライトなどが聞きません。つら。

総括

モジュールを書くなら ISEからVSへ。

むしろ VS を使った方が幸せになれます。

まとめ

単体のスクリプトなら、ISE + ISESteroids または VS + PowerShell Tools for Visual Studio

モジュールなら、VS + PowerShell Tools for Visual Studio

DSC は、ISE + ISESteroids

v5で、 Powershell.exe 限定だった機能のいくつかが ISE や他のエディタで使えるようになるので、普段使いのコンソールはISEでしょう。

PowerGUI はオワコン

初めはPowerGUI も触れようと思いましたが、Dell に買収されててw

もうオワコンでした。

exe コンパイルは面白い機能だったのですが、それだけですしいらないですね。

*1:ここではあげませんが、Atom や Vim、Sublime Text を拡張して使うこともできます

*2:Integrated Script Environment

*3:ISESteroids をいれればみれます