PowerShellのプロンプトを劇的に見やすく!自作スクリプトで表示を自分好みにカスタマイズする方法

PowerShellを日常的に利用しているエンジニアの皆様、標準のプロンプト表示に物足りなさを感じたことはありませんか?
デフォルトではカレントディレクトリのみが表示されるシンプルな仕様ですが、複数のサーバーを管理したり、長時間作業を行ったりする環境では、ホスト名や現在時刻といった情報が一目で確認できると非常に便利です。
本記事では、引数一つでプロンプトの表示内容を動的に切り替えられる自作スクリプト「PrmptShow.ps1」の活用術をご紹介します。
このスクリプトは、日付やユーザー名の表示はもちろん、ディレクトリ階層をスマートに省略表示したり、作業の合間に癒やしを与えるランダムな顔文字を表示したりといった工夫が凝らされています。
「今どのユーザーで操作しているか」「実行時の正確な時間はいつか」といった情報をプロンプトに組み込むことで、オペレーションミスの防止と作業効率の向上を同時に実現しましょう。
具体的なコードの解説から実際の導入手順まで、すぐに使えるカスタマイズ術を詳しく解説していきます。
PowerShellの「prompt」関数を定義し直せば、表示は自由自在に変更できる
PowerShellのコンソール画面に表示されるプロンプト(入力待ち状態の文字列)は、実はシステム内にあらかじめ定義された「prompt」という名称の関数によって制御されています。
この関数をユーザー側で再定義(オーバーライド)することで、表示内容を標準の状態から劇的に変化させることが可能です。
提供されたスクリプト「PrmptShow.ps1」では、この仕組みを最大限に活用し、function global:prompt という形式でスコープをグローバルに指定して定義しています。
これにより、スクリプト実行後もセッション全体でカスタマイズされたプロンプトが有効になります。
動的な情報取得と表示の柔軟性
プロンプト関数内では、通常のPowerShellコマンドを自由に実行できるため、以下のような情報をリアルタイムに反映させることができます。
- システム情報の可視化:
$env:COMPUTERNAMEや$env:USERNAMEといった環境変数を参照することで、現在操作しているホスト名やユーザー名を常に表示させ、作業ミスを防止します。 - 日時の自動更新:
Get-Date -format "MM/dd HH:mm"を用いることで、コマンドを実行するたびに最新の時刻を表示させることが可能です。 - パス表示の最適化:
パスが長くなりすぎて作業画面を圧迫しないよう、Split-Pathコマンドを用いて親フォルダーや現在のフォルダー名のみを抽出して表示する工夫が凝らされています。
視認性を高める装飾とロジック
単に情報を並べるだけでなく、視覚的なフィードバックを強化できる点もカスタマイズの醍醐味です。
- カラーカスタマイズ:
Write-Hostコマンドの-ForegroundColorオプションを使用することで、ホスト名をDarkGreen、パスをGreenで色分けし、情報の区切りを一目で判別できるようにしています。 - 状態に応じた表示の切り替え:
switch文を利用することで、引数(Arg_01)の値に基づいた複数の表示パターン(日付のみ、ホスト名込み、パス込みなど)を一台のスクリプトで管理できる設計となっています。 - 遊び心の追加:
Get-Randomを用いて、プロンプトの一部にランダムな顔文字(例:'-^)bや▲ ▽)を表示させるなど、実用性の中にパーソナライズされた要素を組み込むことも容易です。
このように、PowerShellのプロンプトは単なる入力行の先頭文字列ではなく、作業に必要なコンテキストを瞬時に把握するための「高機能なダッシュボード」へと進化させることができるのです。
プロンプトをカスタマイズするメリット
PowerShellのプロンプトを標準設定からカスタマイズすることには、単なる見た目の変更を超えた実用的なメリットが数多くあります。
提供されたスクリプト「PrmptShow.ps1」の機能を例に、具体的な利点を整理します。
オペレーションミスの防止
作業中の「ホスト名」や「実行ユーザー名」をプロンプトに常時表示させることで、重大な操作ミスを未然に防ぐことができます。
- 環境の取り違え防止:
複数のサーバーにリモート接続して作業する場合、現在どのマシンを操作しているかが一目でわかります。 - 権限の意識:
管理者権限(Administrator)や特定のユーザーアカウントで実行していることを常に視界に入れることで、意図しない設定変更を防ぎます。
作業ログと時間管理の効率化
プロンプトに現在時刻(月/日 時:分)を表示させる機能は、時間管理において非常に有効です。
- 実行タイミングの把握:
コマンドを実行した時刻が画面上に残るため、作業ログを後から振り返る際の備忘録となります。 - 処理時間の目安:
長い処理が終わった際、プロンプトが返ってきた時刻を見ることで、おおよその所要時間を即座に確認できます。
ディレクトリ階層の視認性向上
標準のプロンプトではカレントディレクトリのフルパスが表示されますが、階層が深くなると入力スペースが圧迫されてしまいます。
- 情報の取捨選択:
スクリプトでは、パスの「2つ上のフォルダー名」と「現在のフォルダー名」のみを抽出して表示する工夫がなされています。 - 画面の有効活用:
必要な情報(今どこにいるか)を維持しつつ、コマンド入力欄を広く確保できるため、長いコマンドを打つ際の視認性が向上します。
メンタル面へのポジティブな影響
実用的な情報だけでなく、遊び心を加えることで長時間の作業による疲労を軽減する効果も期待できます。
- ランダムな変化:
Get-Randomを用いて、プロンプトの末尾に時々異なる顔文字や記号(例:'-^)bや▲ ▽)が表示される仕掛けにより、単調なターミナル作業に程よい変化が生まれます。 - パーソナライズ:
自分好みのカラー設定(DarkGreenやGreenなど)を施すことで、ターミナルが「使い込まれた自分専用のツール」へと進化し、作業への愛着が高まります。
引数で表示を切り替える多機能スクリプトの解説
提供されたスクリプト「PrmptShow.ps1」は、単に情報を表示するだけでなく、ユーザーの状況に合わせて表示モードを切り替えられる設計になっています。ここでは、その内部ロジックのポイントを詳しく解説します。
引数による柔軟なモード切替機能
スクリプトの冒頭で Param([Int]$Arg_01=0) を定義しており、実行時に引数を渡すことでプロンプトの構成を即座に変更できます。
- モード1:
日付 + ホスト名 + ユーザー名を表示し、環境の識別を最優先します。 - モード2:
日付 + ユーザー名を表示します。 - モード3:
日付のみを表示し、画面をシンプルに保ちます。 - モード4:
日付 + ホスト名 + カレントパスを表示します。 - デフォルト(0またはその他):
日付 + カレントパスを表示します。
環境変数による状態保持の工夫
このスクリプトの賢い点は、引数で受け取った値を環境変数 $env:PrmptShow_Arg_01 に格納している点です。
PowerShellのプロンプト関数は、コマンドを実行するたびに呼び出されます。
環境変数に設定を保持しておくことで、一度スクリプトを実行すれば、そのセッション中はずっと選択したモードが維持される仕組みになっています。
視認性を追求したパス表示ロジック
「日付+パス」を表示する際、フルパスを表示すると画面が狭くなってしまいます。
このスクリプトでは、独自のロジックでパスを短縮しています。
- 階層の抽出:
Split-Pathを利用して、現在のフォルダーとその親フォルダー(2つ上の階層)のみを取得します。 - 省略表示:
階層が深い場合は、先頭に...\を付与することで、視覚的に「中間のパスが省略されていること」を示しながら、今どこにいるかを端的に伝えます。 - 色分け:
Write-Hostで-ForegroundColor Greenを指定し、パスの部分を緑色で強調することで、他のテキスト情報と混同しないよう配慮されています。
作業を彩るランダムなエフェクト
プロンプトの最後には、Get-Random を用いたユニークな仕掛けが用意されています。
- 確率的な表示:
1から160の乱数を発生させ、特定の数値(1, 5, 6, 10, 15, 20)が出たときだけ顔文字や記号を表示します。 - バリエーション:
'-^)bや▲ ▽、%(x_xなど、その時の運次第で異なる表情がプロンプトに現れます。 - デフォルト:
多くの場合は空白()が表示されるため、作業の邪魔にならず、時々現れる変化がアクセントとなります。
カスタマイズスクリプトの導入手順
「PrmptShow.ps1」を使用してプロンプトを自分好みに変更し、それを永続化させるための具体的な手順を解説します。
スクリプトファイルの保存と準備
まずは提供されたソースコードを自分の環境で利用できる状態にします。
- ファイルの作成:
テキストエディタを開き、提供されたコードを貼り付けて「PrmptShow.ps1」という名前で保存します。 - 保存場所の選定:
頻繁に呼び出すスクリプトのため、ユーザーディレクトリ内の「Documents\WindowsPowerShell\Scripts」など、管理しやすい場所に配置することをおすすめします。
スクリプト実行ポリシーの確認
PowerShellでは、初期設定で自作スクリプトの実行が制限されている場合があります。
- ポリシーの確認:
PowerShellを管理者権限で開き、Get-ExecutionPolicyを実行して現在の設定を確認します。 - ポリシーの変更:
もしRestrictedになっている場合は、Set-ExecutionPolicy RemoteSignedを実行して、ローカルで作成したスクリプトを実行可能に変更してください。
手動実行による動作テスト
まずは引数を指定してスクリプトを直接実行し、表示が切り替わるか確認します。
- 基本の実行方法:
PowerShell上で.\PrmptShow.ps1 -Arg_01 1と入力し、実行します。 - 引数によるパターンの確認:
- 引数に「1」を指定すると「日付+ホスト名+ユーザ名」の形式になります。
- 引数に「4」を指定すると、ホスト名に加えて「2つ上のフォルダー名」を含んだパス表示に切り替わります。
- 初期情報の確認:
スクリプトを実行すると、現在の「実行パス」「ホスト名」「ユーザ名」が画面に出力されるため、正しく環境を認識できているか確認してください。
$PROFILE への登録(永続化設定)
PowerShellを起動するたびに自動でプロンプトをカスタマイズしたい場合は、$PROFILE(プロファイル)にスクリプトの呼び出しを追記します。
- プロファイルファイルの編集:
notepad $PROFILEを実行して、設定ファイルを開きます。 - 呼び出し設定の追加:
ファイルの末尾に、スクリプトのフルパスと希望する引数を追記します。
(例:& "C:\Scripts\PrmptShow.ps1" 4) - 環境変数の活用:
スクリプト内で$env:PrmptShow_Arg_01を使用して引数の値を保持しているため、一度読み込めばセッションの間はずっとその表示設定が維持されます。
自分専用のプロンプトで快適な開発環境を手に入れよう
PowerShellのプロンプトカスタマイズは、単なる見た目の変更に留まりません。
- 情報の集約:
日付、ホスト名、ユーザー名、そして整理されたパス情報を一箇所に集約することで、視線移動を最小限に抑えられます。 - 実用性と遊び心の両立:
業務に必要な情報の合間に、Get-Randomによる「Work文字(顔文字)」が表示される仕掛けは、作業中のちょっとしたアクセントになります。 - 環境への適応:
引数一つで表示モードを切り替えられる柔軟性は、開発、運用、デモなど、シーンに合わせた最適な情報提示を可能にします。
このスクリプトをベースにして、自分にとって最も価値のある情報をプロンプトに組み込み、世界に一つだけの作業環境を構築してみてください。
参考スクリプト:
<#
.SYNOPSIS
コマンドプロンプトの表示を動的に変更するスクリプト。
.DESCRIPTION
引数「Arg_01」の値をもとに、PowerShellプロンプトの表示内容をカスタマイズします。
設定をセッション内で保持するために、環境変数「env:PrmptShow_Arg_01」を利用しています。
.PARAMETER Arg_01
| 値| 表示されるプロンプトの内容
|-----|-----------------------
| 1| 日付 + ホスト名 + ユーザ名
| 2| 日付 + ユーザ名
| 3| 日付
| 4| 日付 + ホスト名 + パス(短縮版)
|Other| 日付 + パス(短縮版) ※デフォルト設定
.EXAMPLE
PS > .\PrmptShow.ps1 -Arg_01 1
プロンプトが「MM/dd HH:mm HostName (UserName) > 」の形式に変わります。
.NOTES
【作成】20xx/xx/xx ポコぺん 新規作成
#>
# --- 引数取得 ---
Param([Int]$Arg_01=0)
# --- 環境変数に設定を保持 ---
$env:PrmptShow_Arg_01 = $Arg_01
# --- プロンプト関数定義 ---
function global:prompt {
# ランダムな装飾文字(Work文字)の選定
switch(Get-Random -Minimum 1 -Maximum 160) {
01 { $emg = "'-^)b" }
05 { $emg = "△ ▼" }
06 { $emg = "▲ ▽" }
10 { $emg = "%(x_x" }
15 { $emg = "|-')/" }
20 { $emg = "'-')(._.ウン" }
default { $emg = " " }
}
# 現在時刻の取得
$now = Get-Date -format "MM/dd HH:mm"
# プロンプトの表示判定ロジック
switch($env:PrmptShow_Arg_01) {
1 {
# 日付+ホスト名+ユーザ名
Write-Host($now + " ") -NoNewline
Write-Host($env:COMPUTERNAME) -NoNewline -ForegroundColor DarkGreen
Write-Host("(") -NoNewline
Write-Host($env:USERNAME) -NoNewline -ForegroundColor DarkGreen
Write-Host(")") -NoNewline
}
2 {
# 日付+ユーザ名
Write-Host($now + " ") -NoNewline
Write-Host($env:USERNAME + " ") -NoNewline -ForegroundColor DarkGreen
}
3 {
# 日付のみ
Write-Host($now + " ") -NoNewline
}
4 {
# 日付+ホスト名+パス
try {
$work_tmp = [string](Split-Path -Leaf (Split-Path -Parent (pwd)))
if($work_tmp.Substring($work_tmp.Length - 1, 1) -ne "\") {
$work_tmp = "...\" + $work_tmp + "\"
}
} catch {
$work_tmp = ""
}
$work_tmp += (Split-Path -Leaf (pwd))
Write-Host($now + " ") -NoNewline
Write-Host($env:COMPUTERNAME + " ") -NoNewline -ForegroundColor DarkGreen
Write-Host($work_tmp + " ") -NoNewline -ForegroundColor Green
}
default {
# 日付+パス(標準の挙動)
try {
$work_tmp = [string](Split-Path -Leaf (Split-Path -Parent (pwd)))
if($work_tmp.Substring($work_tmp.Length - 1, 1) -ne "\") {
$work_tmp = "...\" + $work_tmp + "\"
}
} catch {
$work_tmp = ""
}
$work_tmp += (Split-Path -Leaf (pwd))
Write-Host($now + " ") -NoNewline
Write-Host($work_tmp + " ") -NoNewline -ForegroundColor Green
}
}
# 装飾文字と入力記号の表示
Write-Host($emg + " ") -NoNewline
return "> "
}
# --- 実行時の初期情報表示 ---
Write-Host ""
Write-Host ("実行パス:" + (Convert-Path .) + "\")
Write-Host ("ホスト名:" + $env:COMPUTERNAME)
Write-Host ("ユーザ名:" + $env:USERNAME)
Write-Host ""