本エントリは、
Differences between the ISE and PowerShell console | PowerShell Team Blog
の内容をまるっと翻訳というか要約というかした感じの内容です。
古い情報もあったのでその辺は更新しています。
中の人が誰かWindows PowerShell Blogの翻訳もやってくれると嬉しいのですが...
PowerShell ISEとPowerShellコンソール(powershell.exe)の違い
1. PowerShell ISEではコンソールアプリケーションの実行が制限されています。
PowerShell ISEからcmd /k [ほげほげ]
なコマンドを実行するとハングします。
ハングしたらCtrl+C
やCtrl+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; }
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コマンドはカスタマイズされています。
で書いた様にPowerShell ISEではOut-Host -Paging
はエラーとなりmore
ファンクションもページ処理をしません。
7. PowerShell ISEではStart-Transcriptコマンドレットが動作しません。
これはPowerShell 5.0からはサポートされる様になりました。
細かい話はぎたぱそ先生のブログを見てください。
ただ手元の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
は同じディレクトリあるとのサジェストが表示されます。
サジェストは下の部分、
Suggestion [3,General]: コマンド iexplore.exe は見つかりませんでしたが、現在の場所に存在します。
Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。
このコマンドを信頼する場合は、".\iexplore.exe" と入力してください。
詳細については、"get-help about_Command_Precedence" と入力してヘルプを参照してください。
PowerShell ISEではこのサジェスト機能が動作しません。
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" }