Windows PowerShellの実行ポリシーとプロンプトのカスタマイズ

PowerShell のデフォルトのプロンプトは、「PS カレントディレクトリのパス >」となっていて、ディレクトリが深くなるとすごく長くなる。これをもっとシンプルにしようと思った。具体的には、Ubuntu と同様に「ユーザー名@ホスト名 >」くらいでいい。
ググってみると、プロンプトは prompt 関数の返り値が使われるので、%USERPROFILE%\Documents\WindowsPowerShell\profile.ps1 ファイルに prompt 関数を書いておけばいいようだ。.ps1 てのは PowerShell のスクリプトの拡張子ね。
で、prompt 関数は次のようにした。

function prompt {
    $env:USERNAME + "@" + $env:COMPUTERNAME + " > "
}

さて、これで新しいシェルを立ち上げれば、profile.ps1 が読み込まれてプロンプトの変更が反映されるはず。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

. : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\takatoh\Documents\WindowsPowerShell\profile
.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=1
35170) を参照してください。
発生場所 行:1 文字:3
+ . 'C:\Users\takatoh\Documents\WindowsPowerShell\profile.ps1'
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

おっと、エラーになった。何やらスクリプトの実行が無効になっているらしい。ググってみると、PowerShell には実行ポリシーというのがあって、これの設定でスクリプトの実行を制御しているらしい。詳しくは上のメッセージにも書かれている、↓のページに説明がある。

cf. about_Execution_Policies

このページに Windows10 については書かれていないけど、次のようにすると実行ポリシーが Restricted であることがわかる。

PS C:\Users\takatoh> Get-ExecutionPolicy
Restricted

Restricted というポリシーは、コマンドは実行できるがスクリプトは実行できない、というものらしい。なので、これを変更してやればいい。具体的には次のようにした。

PS C:\Users\takatoh> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -scope CurrentUser

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

Y を入力してこれで実行ポリシーの変更はできたはず。RemoteSigned という実行ポリシーは、スクリプトの実行はできるがインターネットからダウンロードされたスクリプトは信頼された発行元によってデジタル署名されている必要がある、というもの。ローカルのスクリプトの実行には支障がないのでこれにした。

さて、改めて PowerShell を立ち上げてみよう。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

takatoh@FLAMBAY > Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       Undefined


takatoh@FLAMBAY > Get-ExecutionPolicy
RemoteSigned

期待通り、プロンプトが変更されていて、カレントユーザーの実行ポリシーも RemoteSigned になっているのがわかる。
これでOK。