しばたテックブログ

気分で書いている技術ブログです。

PowerShellのホストとプロファイルについてまとめ

PowerShellがオープンソース、マルチプラットフォーム化したのを踏まえ、改めてPowerShellのホストとプロファイルについてまとめてみました。

ホスト

PowerShellにおけるホストとは簡単に言ってしまうとPowerShellの実行環境のことです。

基本的なホスト

従来のPowerShellではホストはPowerShell コンソール(powershell.exe)とPowerShell ISEの2つだけでした。それぞれ32bit/64bit版があります。
これに先日発表されたLinxu/Mac版のPowerShellが加わり、こちらは64bit版のみの提供となります。

  1. [Windows] PowerShell コンソール (32bit/64bit)
    • [Linux] PowerShell コンソール (64bit)
    • [Mac] PowerShell コンソール (64bit)
  2. [Windows] PowerShell ISE (32bit/64bit)

OSが違ってもPowerShell コンソールは同じコードベースなため、ホストの種類としては同一となり、ISEとあわせて2種類になります。

拡張機能のホスト

PowerShell コンソールPowerShell ISEの他にVisual Studio/Visual Studio Codeなどの拡張機能として以下のホストが存在します。

  1. [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)を別途起動してから必要なアセンブリをロードする形式に変わっている。
  2. [Windows] PowerShell Tools for Visual Studio (32bit)
    • Visual StudioのPowerShell拡張のIntegrated Console。Version.3.0.235 以降で利用可能
  3. [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

プロファイルが実行される順序は上表の通り、AllUsersAllHostsAllUsersCurrentHostCurrentUserAllHostsCurrentUserCurrentHostとなっています。

また、プロファイルの場所についてですが、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変数で取得することができます。
この$PROFILEstring型の値ですが、上記の各プロファイルの情報が取得できる様に特別なプロパティが付与されています。

どういう事かというと、普通に$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追記】
ちょっと書き忘れていたので追記しておきます。
以前、

stknohg.hatenablog.jp

で書いた様にWindows Server 2016のNano Server(PowerShell Core)ではプロファイルの機能は無く、$PROFILE変数も使えません。
ただ、オープンソース化したPowerShell Core(6.0.0.alpha)ではプロファイルの機能はありますので、いつになるかはわかりませんが、そのうちNano ServerのPowerShellにもプロファイルは導入されるだろうと思われます。

最後に

とりあえずこんな感じです。
今後新しいホストが増える様でしたら追記していきます。