PowerShellがオープンソース、マルチプラットフォーム化したのを踏まえ、改めてPowerShellのホストとプロファイルについてまとめてみました。
ホスト
PowerShellにおけるホストとは簡単に言ってしまうとPowerShellの実行環境のことです。
基本的なホスト
従来のPowerShellではホストはPowerShell コンソール(powershell.exe)とPowerShell ISEの2つだけでした。それぞれ32bit/64bit版があります。
これに先日発表されたLinxu/Mac版のPowerShellが加わり、こちらは64bit版のみの提供となります。
- [Windows] PowerShell コンソール (32bit/64bit)
- [Linux] PowerShell コンソール (64bit)
- [Mac] PowerShell コンソール (64bit)
- [Windows] PowerShell ISE (32bit/64bit)
OSが違ってもPowerShell コンソールは同じコードベースなため、ホストの種類としては同一となり、ISEとあわせて2種類になります。
拡張機能のホスト
PowerShell コンソール
、PowerShell ISE
の他にVisual Studio/Visual Studio Codeなどの拡張機能として以下のホストが存在します。
- [Windows][Linux][Mac] PowerShell Language Support for Visual Studio Code (ホストは32ibt/64bit)
- Visual Studio Codeの拡張機能のデバッグコンソール。Version.0.6 以降で利用可能
- 昔は
Microsoft.PowerShell.EditorServices.Host.exe
が独自のホストだったが今はpowershell(.exe)
を別途起動してから必要なアセンブリをロードする形式に変わっている。
- [Windows] PowerShell Tools for Visual Studio (32bit)
- Visual StudioのPowerShell拡張のIntegrated Console。Version.3.0.235 以降で利用可能
- [Windows] Visual Studio Package Manager Console (32bit)
- Visual Studio上のNuget Package Manager Console
現時点で公式にリリースされているホストはこの5種類になります。
余談ですが、PowerShellのホストはその気になれば自作できますので、探せばほかの開発環境などで使われているホストもあるかもしれません。
だだ、そこまで考慮するとキリがないため今回はこの5ホストに絞った内容にします。
ホスト名の一覧
各ホストの情報には$Host
変数でアクセスすることができます。
アクセス可能な情報はホストによって異なりますので、本エントリではホスト名の一覧を紹介するにとどめておきます。
ホスト | $Host.Name |
---|---|
[Windows/Linux/Mac] PowerShell コンソール (32bit/64bit) | ConsoleHost |
[Windows] PowerShell ISE (32bit/64bit) | Windows PowerShell ISE Host |
[Windows/Linux/Mac] PowerShell Language Support for Visual Studio Code (ホストは32ibt/64bit) | Visual Studio Code Host |
[Windows] PowerShell Tools for Visual Studio (32bit) | PowerShell Tools for Visual Studio Host |
[Windows] Visual Studio Package Manager Console (32bit) | Package Manager Host |
プロファイル
ここからプロファイルについて触れていきます。
プロファイルとは、about_Profilesに、
Windows PowerShell プロファイルは Windows PowerShell が開始するときに動作するスクリプトです。
と書かれている通りのものでBashでいうところの.bash_profile
です。
基本的なところはぎたぱそ先生のこちらの記事を見てもらえば良いでしょう。
プロファイルの種類
プロファイルは実行ユーザー、実行ホストに応じて以下の4種類存在しています。
種類 | 実行順 | 説明 | 場所 |
---|---|---|---|
AllUsersAllHosts | 1 | 全ユーザー、すべてのホストで有効なプロファイル | $PSHOME |
AllUsersCurrentHost | 2 | 全ユーザー、現在のホストで有効なプロファイル | $PSHOME |
CurrentUserAllHosts | 3 | 現在のユーザー、すべてのホストで有効なプロファイル | Windows : [MyDocument]\WindowsPowershell または[MyDocument]\Powershell Linux/Mac : $HOME/.config/powershell |
CurrentUserCurrentHost | 4 | 現在のユーザー、現在のホストで有効なプロファイル | Windows : [MyDocument]\WindowsPowershell または[MyDocument]\Powershell Linux/Mac : $HOME/.config/powershell |
プロファイルが実行される順序は上表の通り、AllUsersAllHosts
→AllUsersCurrentHost
→CurrentUserAllHosts
→CurrentUserCurrentHost
となっています。
また、プロファイルの場所についてですが、AllUsers*なプロファイルは$PSHOME
になります。
$PSHOME
はPowerShellの実行バイナリのあるディレクトリになりますので、OSの種類、32bit/64bit版によって異なります。
続けてCurrentUser*についてですが、Windowsの場合は[MyDocument]としていますが、正確にはSystem.Environment.SpecialFolder.Personal
で取得できるパスとなっており、設定によりマイドキュメントの場所を変えている場合はプロファイルの場所も変わるので注意が必要です。
LinuxやMacの場合は$HOME
の場所をHOME環境変数
から取得しているため、実際に試してはいないのですが、HOME環境変数
を書き換えるとプロファイルの場所も変わるはずです。
どのドキュメントか失念しましたが、MSDN上でもプロファイルの場所がC:\Users\[UserName]\Document
固定になっているものがあり、これは正確ではないので気をつけてください。
余談ですが、細かい仕様が気になる方はソースのこのへんやこのへんを見ると参考になります。
プロファイルのファイル名
そして、プロファイルのファイル名は、*AllHostsなプロファイルはprofile.ps1
固定ですが、*CurrentHostなプロファイルはホスト毎に異なります。
以下にホスト毎のファイル名を記載しておきます。
ホスト \ 種類 | AllUsersAllHosts | AllUsersCurrentHost | CurrentUserAllHosts | CurrentUserCurrentHost |
---|---|---|---|---|
PowerShellコンソール | profile.ps1 | Microsoft.PowerShell_profile.ps1 | profile.ps1 | Microsoft.PowerShell_profile.ps1 |
PowerShell ISE | profile.ps1 | Microsoft.PowerShellISE_profile.ps1 | profile.ps1 | Microsoft.PowerShellISE_profile.ps1 |
PowerShell Language Support for Visual Studio Code | profile.ps1 | Microsoft.VSCode_profile.ps1 | profile.ps1 | Microsoft.VSCode_profile.ps1 |
PowerShell Tools for Visual Studio | profile.ps1 | PoshTools_profile.ps1 | profile.ps1 | PoshTools_profile.ps1 |
Visual Studio Package Manager Console | profile.ps1 | NuGet_profile.ps1 | profile.ps1 | NuGet_profile.ps1 |
$PROFILE
プロファイルのパスはいちいち全部覚えなくても$PROFILE
変数で取得することができます。
この$PROFILE
はstring
型の値ですが、上記の各プロファイルの情報が取得できる様に特別なプロパティが付与されています。
どういう事かというと、普通に$PROFILE
にアクセスした場合は、
PS C:\> $PROFILE C:\Users\[Username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
の様にCurrentUserCurrentHost
の値が取得できます。
続けて以下の様にFormat-List -Force
とすると追加されたプロパティの情報を見ることができます。
PS C:\> $PROFILE | Format-List -Force AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1 AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1 CurrentUserAllHosts : C:\Users\[Username]\Documents\WindowsPowerShell\profile.ps1 CurrentUserCurrentHost : C:\Users\[Username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 Length : 80
このため、たとえばAllUsersAllHosts
のパスを取得する場合は
PS C:\> $PROFILE.AllUsersAllHosts C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
の様にすればOKです。
【補足】Nano Serverのプロファイルについて
【2016/10/17追記】
ちょっと書き忘れていたので追記しておきます。
以前、
で書いた様にWindows Server 2016のNano Server(PowerShell Core)ではプロファイルの機能は無く、$PROFILE
変数も使えません。
ただ、オープンソース化したPowerShell Core(6.0.0.alpha)ではプロファイルの機能はありますので、いつになるかはわかりませんが、そのうちNano ServerのPowerShellにもプロファイルは導入されるだろうと思われます。
最後に
とりあえずこんな感じです。
今後新しいホストが増える様でしたら追記していきます。