読者です 読者をやめる 読者になる 読者になる

素敵なおひげですね

PowerShellを中心に気分で書いているブログです。

PowerShell ISEとPowerShellコンソール(powershell.exe)の違い

PowerShell

本エントリは、

Differences between the ISE and PowerShell console - Windows PowerShell Blog - Site Home - MSDN Blogs

の内容をまるっと翻訳というか要約というかした感じの内容です。
古い情報もあったのでその辺は更新しています。

中の人が誰かWindows PowerShell Blogの翻訳もやってくれると嬉しいのですが...

PowerShell ISEとPowerShellコンソール(powershell.exe)の違い

1. PowerShell ISEではコンソールアプリケーションの実行が制限されています。

PowerShell ISEからcmd /k [ほげほげ]なコマンドを実行するとハングします。
ハングしたらCtrl+CCtrl+Breakで復帰させてください。
cmd /c [ほげほげ]なコマンドは実行可能です。

詳細は Console Application (Non) Support in the ISE をみてください。

2. PowerShell ISEではコンソールアプリを実行した際の出力に色が付きません。

PowerShell ISEとpowershell.exeで以下のコードを実行してみるとわかります。

powershell.exe -command { Write-Host "Greenだよ" -ForegroundColor green; }

f:id:stknohg:20151004115706p:plain

f:id:stknohg:20151004115724p:plain

3. PowerShell ISEはデフォルトでSTAです。

PowerShell 2.0まではpowershell.exeはMTAでした。
PowerShell 3.0からはpowershell.exeもSTAがデフォルトになっています。

$Host.Runspace.ApartmentState

を実行するとスレッドアパートメントモードを確認することができます。
STAだとSTAが、MTAだとUnknownが返されます。

4. PowerShell ISEでは[Console]クラスがサポートされません。

例えばISEで[Console]::BackgroundColor = 'white'を実行すると変更が反映されないのがわかります。
一般的にスクリプト内部では[Console]クラスを直接使わずHost API(Write-Hostなど)を使う様にすべきです。

5. PowerShell ISEでは $Host.UI.RawUI クラスは限定的にサポートされます。

ColorとTitleのみがサポートされます。 ISEでは$psISE.Optionsを使う方がより多くの項目に対して色を指定できます。

6. PowerShell ISEではMoreコマンドはカスタマイズされています。

stknohg.hatenablog.jp

で書いた様にPowerShell ISEではOut-Host -Pagingはエラーとなりmoreファンクションもページ処理をしません。

7. PowerShell ISEではStart-Transcriptコマンドレットが動作しません。

これはPowerShell 5.0からはサポートされる様になりました。
細かい話はぎたぱそ先生のブログを見てください。

tech.guitarrapc.com

ただ手元のWindows 8.1(PowerShell 4.0)な環境では普通にStart-Transcriptが使えています...この辺の事情はちょっとよくわかりません。

---- 2015/10/09追記 ----
PowerShell 4.0な環境でもKB3000850を適用するとISEでStart-Transcriptが使える様です。
---- 追記ここまで ----

8. PowerShell ISEではスレッドのカルチャの扱いが異なります。

コンソールをサポートしないカルチャ(例えばアラビア語)の場合、ISEではGet-Cultureの結果がar-SAとなり、powershell.exeではGet-Cultureの結果がen-US (もしくは他のフォールバックされたカルチャ)となります。

9. PowerShell ISEではコマンド名のサジェスト機能が動作しません。

例えばpowershell.exeからC:\Program Files\Internet Explorerディレクトリでiexplore.exeを呼び出した場合、以下の様にコマンドが無いエラー(.\iexplore.exeと呼ぶ必要がある)が出るものの、iexplore.exeは同じディレクトリあるとのサジェストが表示されます。

f:id:stknohg:20151004120118p:plain

サジェストは下の部分、

Suggestion [3,General]: コマンド iexplore.exe は見つかりませんでしたが、現在の場所に存在します。
Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。
このコマンドを信頼する場合は、".\iexplore.exe" と入力してください。
詳細については、"get-help about_Command_Precedence" と入力してヘルプを参照してください。

PowerShell ISEではこのサジェスト機能が動作しません。

f:id:stknohg:20151004120413p:plain

10. PowerShell ISEはPowerShellコンソールと異なるプロファイルで動作します。

PowerShell ISEのプロファイルはMicrosoft.PowerShellISE_profile.ps1に記述します。
powershell.exeのプロファイルはMicrosoft.PowerShell_profile.ps1です。

プロファイルの詳細については以下の記事を参照してください。
http://msdn.microsoft.com/en-us/library/bb613488(VS.85).aspx

http://www.leeholmes.com/blog/TheStoryBehindTheNamingAndLocationOfPowerShellProfiles.aspx
http://www.leeholmes.com/blog/2006/04/26/the-story-behind-the-naming-and-location-of-powershell-profiles/

ちなみに$profile.CurrentUserAllHostsのプロファイルはPowerShell ISE、Powershell.exe両方で使えます。

11. PowerShell ISEでのみ$psISE変数が使えます。

powershell.exeには$psISE変数は存在しません。

http://psisecream.codeplex.com/http://blogs.msdn.com/powershell/archive/2008/12/29/powershell-ise-can-do-a-lot-more-than-you-think.aspx を見てみてください。

また、以下の様にして$psISE変数の存在を確認することができます。

 ls variable: | ? { $_.name -eq "psISE" }