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 3.0からはその見た目も進化して使いやすくなっています。

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

メリット

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

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

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

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

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

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

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

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

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

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

image

コードハイライト

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

image

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

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

https://tech.guitarrapc.com/entry/2014/04/18/065116

https://tech.guitarrapc.com/entry/2014/03/28/070501

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

https://github.com/lzybkr/TabExpansionPlusPlus

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

image

RunSpace の分離

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

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

image

Snippet の拡張

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

image

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

image

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

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

image

image

デバッグ機能

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

image

デメリット

正直、機能足りません。

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

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

複数ファイルの処理

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

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

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

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

image

正直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を使いましょう。

https://visualstudiogallery.msdn.microsoft.com/c9eb3ba8-0c59-4944-9a62-6eee37294597

https://tech.guitarrapc.com/entry/2014/03/19/045944

メリット

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

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

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

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

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

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

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

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

image

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

image

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

image

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

https://visualstudiogallery.msdn.microsoft.com/dbcb8670-889e-4a54-a226-a48a15e4cace

NuGet

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

image

独自の便利機能

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

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

例えばこれが、

image

こう

image

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

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

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

サポートしています。

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

image

image

image

テスト連携

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

image

https://github.com/pester/Pester

https://github.com/jonwagner/PSate

他言語連携

当然ですが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をいれればみれます