LoginSignup
0
0

More than 1 year has passed since last update.

PowerShellのプロンプト切り替え関数

Last updated at Posted at 2022-01-22

はじめに

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

参考

おわりに

技術的にこれが最適かどうかはわかりませんが、とりあえず自分がやりたかったことは実現できました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0