はじめに
PowerShellでプロンプトを設定した後に、元に戻す方法がわからなくて試行錯誤しました。設定の変更にはprompt
という組み込み関数の定義を変更する必要があります。元に戻す関数を定義すれば良いだけなのですが、一時的に切り替えて、また元に戻したかったので、トグルさせる関数を定義してみました。
初期値の確認
元に戻すためには、初期値を知る必要があります。下記のコマンドで確認をします。
(Get-ChildItem function:prompt).Definition
結果は下記のようになっていました。
"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
# .Link
# https://go.microsoft.com/fwlink/?LinkID=225750
# .ExternalHelp System.Management.Automation.dll-help.xml
コメント部分は不要なので、最初の行だけを利用します。
従って、プロンプトを初期値に戻すには、下記のようにすれば良いことになります。
function prompt {
"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
}
プロンプト切り替え関数の定義
いつでも呼び出して使えるようにするには、$profile
ファイルに関数として登録すれば良いのですが、「変更」と「元に戻す」を1つの関数で実現したくなり、試行錯誤しました。現在のプロンプトの値を得るのはprompt
関数の呼び出しになるので、単純にprompt
関数の中で判定して切り替えることはできません。そこで、動作をトグルする関数を定義して、その中で関数定義を切り替えることにしました。「変更」する場合のプロンプトを"PS > "
としたので、現在のprompt
がこれと等しいかどうかを判定して切り替えます。この判定部分とelse
の定義部分との文字列は同じにする必要があります。関数を抜けた後でも有効にするために、function
定義は、global:prompt
とする必要がありました。
コード
function toggle_prompt {
if ((prompt) -eq "PS > ")
{function global:prompt {"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "}}
else
{function global:prompt {"PS > "}}
}
確認環境
- Windows10 Home 21H2
- PoweShell 5.1
参考
おわりに
技術的にこれが最適かどうかはわかりませんが、とりあえず自分がやりたかったことは実現できました。