PowerShellのようなターミナルでコマンドインターフェースを使っていると、パッと見どこでコマンド打ってどこからメッセージが出てきているのかわかりにくいことがあります。
なのではるか昔のUNIX時代からプロンプトに色を付けたりするのが定番のカスタマイズになっているのかと思います。
UNIX上のターミナルではシェルの種類によって違いはありますが環境変数に設定することで色だけでなく色々な情報が出せました。
例えばbashの場合、
PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
こんな感じで.bashrcに定義してたりしました。エスケープシーケンスで色をつけるわけですね。
これと同等なことをPowerShellでしたい。
それだけなんですが、プロンプトの色を変えたいとか言って調べても、なぜかPowerShellのターミナル全体の文字色を変更とかばかりヒットするんですよね。
だいたいコマンドプロンプトっていうと***>っていうところだけを指すんじゃなくてターミナル全体を指すようで、***>ってところをなんて言ったらいいのかな?ってとこから悩んでます。シェルプロンプト?うーんなんだっけ?
ってことで、ちょっと苦労しましたので、備忘録としてメモっておきます。
理屈としては、PowerShell起動時にプロンプトを設定するスクリプトを自動実行させるだけです。
普通に環境変数に設定するだけでよさそうな気もするんですが、PowerShellはpromptっていうファンクションを定義してやらないといけないみたいです。
PowerShellってUNIX系のシェルとコマンド体系が全然違うからほんと厄介です。なんでこんなに変えちゃったんでしょうね。全然とっつき悪い
まず、自動実行ファイルがどれなのかを探します。
echo $profile
私の場合ドキュメント定義されているディレクトリの下の PowerShell\Microsoft.PowerShell_profile.ps1 になってました。
ただ、このファイルは無かったので適当なテキストエディタで作成しました。
そこに
function prompt {
Write-Host "$($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1))" -ForegroundColor Green -NoNewLine
return " "
}
と記載します
すると、緑色でディレクトリ名>って感じのプロンプトになりました。
returnで空白を出しているので>よりは1文字あきます。
私はそれでいいんですが、ここで””とか、全く無くしてしまうと なぜかPS>って出てくるんですよ。なんでですかねー
で、こんな感じになりました。
ちなみに、これを設定したらうまくいかないときがあります。
このシステムではスクリプトの実行が無効になっているため…
って言われる場合、
Get-ExecutionPolicy
と打ってみてください。
私は Restricted ってでてくるとダメなようです。
もう少し詳しく見るとこんな感じです。
●●●●●●●●> Get-ExecutionPolicy -list
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
これは設定できた例。
上記の様にLocalMachineのところがRemoteSignedってなってたら問題なく設定できました。
ダメな場合は、実行ポリシーの変更
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
若しくは、そのスクリプトだけ変更。
PowerShell -ExecutionPolicy RemoteSigned Microsoft.PowerShell_profile.ps1
のどちらかで良いようです。
とりあえずこれでまずは解決。
色々と理解が足りないので、もっとスマートな方法があれば知りたいです。
ちなみにPowerShellのバージョンは 7.5.1 で試してます。
参考にしたのはこのサイトたち


コメント