たかまるの雑記

たまに更新

Powershell v5 のプロンプト

Powershell は prompt 関数でプロンプトに出力する文字列を変更できる

function prompt { "$env:computername > " }

ただ、Powershell v5(v4)では start-transcriptでファイルに出力すると
画面とファイルでプロンプトが一致しない

プロンプトにホスト名と日時を表示する
function prompt { "$(hostname)[$(get-date -f "yyyy/MM/dd HH:mm:ss,fff")] > " }

実行結果

PS C:\work>
PS C:\work> start-transcript ./powershell1.log
トランスクリプトが開始されました。出力ファイル: ./powershell1.log
PS C:\work>
PS C:\work> function prompt { "$(hostname)[$(get-date -f "yyyy/MM/dd HH:mm:ss,fff")] > " }
takamrauPC[2017/05/26 22:43:59,164] >
takamrauPC[2017/05/26 22:44:11,716] >
takamrauPC[2017/05/26 22:44:12,116] > pwd

Path
----
C:\work


takamrauPC[2017/05/26 22:44:13,379] >
takamrauPC[2017/05/26 22:44:17,072] > gc ./powershell1.log -tail 15
**********************
トランスクリプトが開始されました。出力ファイル: ./powershell1.log
PS C:\work> function prompt { "$(hostname)[$(get-date -f "yyyy/MM/dd HH:mm:ss,fff")] > " }
takamrauPC[2017/05/26 22:43:59,164] >
takamrauPC[2017/05/26 22:44:11,716] >
takamrauPC[2017/05/26 22:44:12,116] >
PS C:\work> pwd         ★★★← プロンプトがデフォルトのまま★★★

Path
----
C:\work


takamrauPC[2017/05/26 22:44:13,379] >
takamrauPC[2017/05/26 22:44:17,072] >
takamrauPC[2017/05/26 22:44:18,764] >


関数内でコマンド実行やインスタンスを作成しないで、staticな値のみにすると、画面のプロンプトとファイルのプロンプトは一致する

プロンプトにホスト名と日時を表示する
function prompt { "$env:computername[$("{0:yyyy/MM/dd HH:mm:ss,fff}" -f $([datetime]::now))] > " }

実行結果

PS C:\work>
PS C:\work> start-transcript ./powershell2.log
トランスクリプトが開始されました。出力ファイル: ./powershell2.log
PS C:\work>
PS C:\work> function prompt { "$env:computername[$("{0:yyyy/MM/dd HH:mm:ss,fff}" -f $([datetime]::now))] > " }
takamrauPC[2017/05/26 22:48:29,499] >
takamrauPC[2017/05/26 22:48:33,818] >
takamrauPC[2017/05/26 22:48:34,667] > pwd

Path
----
C:\work


takamrauPC[2017/05/26 22:48:35,401] >
takamrauPC[2017/05/26 22:48:39,698] >
takamrauPC[2017/05/26 22:48:39,816] > gc ./powershell2.log -tail 10
**********************
トランスクリプトが開始されました。出力ファイル: ./powershell2.log
PS C:\work> function prompt { "$env:computername[$("{0:yyyy/MM/dd HH:mm:ss,fff}" -f $([datetime]::now))] > " }
takamrauPC[2017/05/26 22:48:34,667] > pwd         ★★★← コマンド実行しないでEnterのみ入力した行は出力されない★★★

Path
----
C:\work


takamrauPC[2017/05/26 22:48:41,836] >

ただ上の方法だと、コマンドを実行しないでEnterのみ入力したときのプロンプトがファイルに出力されない


そこで2つをあわせて2行出力する

プロンプトにホスト名と日時を表示する
function prompt { $d="{0:yyyy/MM/dd HH:mm:ss,fff}" -f $([datetime]::now);"$env:computername[$d] > ";"$(hostname)[$d] > " }

実行結果

PS C:\work>
PS C:\work> function prompt { $d="{0:yyyy/MM/dd HH:mm:ss,fff}" -f $([datetime]::now);"$env:computername[$d] > ";"$(hostname)[$d] > " }
takamrauPC[2017/05/26 22:53:06,489] >
takamrauPC[2017/05/26 22:53:10,552] >
takamrauPC[2017/05/26 22:53:10,863] > pwd

Path
----
C:\work


takamrauPC[2017/05/26 22:53:11,352] >
takamrauPC[2017/05/26 22:53:12,823] > gc ./powershell3.log -tail 15
**********************
トランスクリプトが開始されました。出力ファイル: ./powershell3.log
PS C:\work> function prompt { $d="{0:yyyy/MM/dd HH:mm:ss,fff}" -f $([datetime]::now);"$env:computername[$d] > ";"$(hostname)[$d] > " }
takamrauPC[2017/05/26 22:53:06,489] >
takamrauPC[2017/05/26 22:53:10,552] >
takamrauPC[2017/05/26 22:53:10,863] >
takamrauPC[2017/05/26 22:53:10,863] > pwd

Path
----
C:\work


takamrauPC[2017/05/26 22:53:11,352] >
takamrauPC[2017/05/26 22:53:12,823] >
takamrauPC[2017/05/26 22:53:17,572] >

コマンド実行時のプロンプトは画面表示とファイルで一致する
Enterのみの場合のプロンプトもファイルに出力される
コマンド実行時は同じプロンプトがファイルに2行出力されてしまうが、しょうがない