MiracleJobLogo
エンジニアのエンジニアによるエンジニアのためのサイト
News 07/19 おすすめ情報に 『 【資格取得者速報】 Aさん 「 Microsoft Security, Compliance, and Identity Fundamentals」 』 を追加しました。
会員登録するとキャリア診断やサイトに参加することができます。
あなたにおすすめな技術情報、資格、仕事などをお知らせします。

無料会員登録


パスワードを忘れた場合
LINEで送る
MiracleJobBanaLeft1
MiracleJobBanaLeft2


誕生日を祝うPowerShell
profile-img
投稿者: muto-sanさん
投稿日:2019/03/07 03:28
更新日:2019/03/07 03:38
like-img
分類
技術
テクノロジー
Windows系サーバ
キャリア
運用・保守 / 構築
投稿内容
こんにちは。muto-sanです。

PowerShellのプロンプトはカスタマイズ可能であることをご存じでしょうか。
Linux(Bash)風にカスタマイズする情報は世の中にあふれていると思うので、少しひねって「誕生日に起動するとそれを祝う表示になる」ようにカスタマイズしてみようと思います。

※ プロンプトって?
コンソール画面のこの赤枠のことです。


通常PowerShellのプロンプトは以下のように定義されています。
※ [Get-Command prompt]コマンドで確認することができます。
=======prompt=======
"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
=======prompt=======

PowerShellは変数$PROFILEで指定されたファイルに関数promptを書き込むことでそちらのプロンプトを優先して表示させますので、このファイルにprompt情報を書き込みます。
ちなみに$PROFILEで定義されたps1ファイルはデフォルトだと存在しないので新しく作りましょう。


====<Microsoft.PowerShell_profile.ps1>====
# 誕生日だけ表示が変わるプロンプト
# 誕生日をMMdd形式で定義
$birthday = "0307"
# 誕生日メッセージ。$env変数を使って環境変数のユーザー名(username)を表示
$message = "Happy Birthday $env:username!!"

# Prompt関数を作る
function prompt() {
    # 今日が誕生日かどうか判定
    if ((Get-Date).ToString("MMdd") -eq $birthday){
        # Get-Dateの結果が$birthdayと一致したら$messageの内容をいい感じにカラフルに表示
        foreach ($s in $message.ToCharArray()){
            (Write-Host $s -ForegroundColor (Get-Random -Maximum 15 -Minimum 10) -NoNewLine)
        }
        #後続のプロンプト
        " $(Get-Location)$('>' * ($nestedPromptLevel + 1)) "
    }else{
        # Get-Dateの結果が$birthdayと一致しなかったらデフォルトの表示
        "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
    }
}
====<Microsoft.PowerShell_profile.ps1>====
このファイルを$PROFILEの場所に置いてPowerShellを起動するとこうなります。



 ...PowerShellはデフォルト状態だとps1ファイルの実行が許可されていないので、
起動時に実行ポリシーを変更するようショートカットに細工しましょう。
赤枠を追記します。


この状態で、$birthdayで定義した日付にプロンプトを表示するとこうなります。


文字列の色(Write-Hostの-ForegroundColorオプション)は表示させる度に再計算するので、プロンプトを表示させる度に変わります。


実行日が$birthdayで定義した日付でない場合はいつも通りです。


誕生日でなくても、何かしらの記念日に起動したらこのような表示がされるサプライズを気になるあの人のPowerShellに仕込んでおけばモテるかもしれません。



##ふざけすぎたので一応ちょっとだけ真面目な使い方
たとえば、実業務ではコマンドの実行結果をエビデンスとして残す場面があるかと思いますがその際にプロンプトに現在時刻を表示するようにしておけば、実行時間を含めた記録を取ることが出来ます
他にも、[hostname.exe]や[whoami.exe]の結果を表示させるようにしておけば、ホスト名やユーザー名も別で記録しておく必要がなくなります。

例:
====<Microsoft.PowerShell_profile.ps1>====
function prompt() {
    $now = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
    "[$now][$(hostname.exe)][$(whoami.exe)] $(Get-Location)$('>' * ($nestedPromptLevel + 1)) "
}
====<Microsoft.PowerShell_profile.ps1>====
このプロファイルを読み込ませるとこうなります。


ここまでやるとさすがに情報過多ですが、プロンプトをカスタマイズすることでちょっとだけ作業が楽になるかもしれません。お試しあれ。
※ Get-Dateを仕込んだ場合の時刻はコマンド実行時刻ではなくプロンプト表示時刻なので注意!

コメント


MiracleJobBanaRight1
MiracleJobBanaRight2
MiracleJobBanaRight3