はじめに
こんにちは、麻菜結と申します。Windowsで開発を始めた方はそろそろコマンドプロンプトを見放し始めているころだと思いますが、Powershellはプロンプトの文字列を簡単に操作できるのはご存じですか?今回は、普段自分が使用しているPowershellのPromptの設定をお見せしようと思います。
環境
環境はPS7です。
> $PSVersionTable
Name Value
---- -----
PSVersion 7.0.0
PSEdition Core
GitCommitId 7.0.0
OS Microsoft Windows 10.0.18363
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
文字の表示の色をいじるのでWrite-Host
が機能するターミナルでやりましょう。
こんなかんじです
以下のPrompt関数を$Profile
に追記すると
function Prompt {
$result = $?
$here = Convert-Path .
$rand = Get-Random 4
$good_words = @("..", "ok", "sure", "well")
$bad_words = @("..", "bad", "what?", "idk")
Write-Host "[${env:username}]${here}" -NoNewLine
if ($result) {
Write-Host " (PS'-')$($good_words[$rand])" -NoNewLine -ForegroundColor "Green"
} else {
Write-Host " (PS'-')$($bad_words[$rand])" -NoNewLine -ForegroundColor "Red"
}
return "`n> "
}
右の不愛想なキャラが前の処理の成否を教えてくれるわけですね。ここからはそれぞれの部分の解説です。
前の処理の結果を取得する
以下の変数から取得できます。Prompt関数内で一度変数に入れているのは、Prompt内の処理で$?
の値が書き換わってしまうからです。
> $?
True
カレントディレクトリのパスを取得する
おそらくこの、Convert-Path
から相対パス.
をフルパスに変換してしまうのが一番簡単だと思います。
> Convert-Path .
C:\
キャラに喋らせたい
これは別になくてもいいのですが、かわいいのでやります。成功したときの言葉と失敗したときの言葉それぞれを用意して、キャラの後ろにくっつけます。
$rand = Get-Random 4
$good_words = @("..", "ok", "sure", "well")
$bad_words = @("..", "bad", "what?", "idk")
ユーザーネームを取得する
完全にBashの影響な気がしますが、なんとなく落ち着くのでつけておきます。
> $env:username
What is return "`n> "?
Prompt関数は返り値として文字列を期待されているのでつけます。Powershellでは改行文字は\n
ではなく`n
なので、マークダウンで入力しづらいなこれも好みですが、入力プロンプトは改行されてた方が読みやすくて良くないですか?さっきまでの-NoNewLine
で出力されていた文字列から改行をかけて>
を表示している感じですね。
return "`n> "
結局どこに書き込めばいいんだっけ?
さらっと流してしまったので念のため。$Profile
変数には今使っているPowershellのプロファイルのパスが入っています。Bashの.bashrc
みたいなものですね。ここに書き込まれた関数、エイリアス、コマンドレット、変数はあらかじめ実行・定義された状態で始まります。
> $Profile
# C:\Usersからはじまり.ps1で終わる何らかのファイルのパス
おわりに
お疲れさまでした。上手く実行できましたか?Write-Host
が非推奨になっているっぽいし、色々な環境でテストしていないので若干不安です。それでも、何らかのお役に立てたら幸いです。ここまで読んでくださってありがとうございます。
次何書こうかな、長編というかいくつかに分けて書きたいネタがあるのでそれ書くかも。