89387


PowerShell5.1のスクリプトでStart/Stop-Transcriptでログを保存する時、  
実行したコマンド自体をログに書き込むことはできないでしょうか。

例えば

[code]

    Start-Transcript
    Write-Host "Hello World"
    Stop-Transctipt
    
[/code]

このスクリプトを実行したとき出力されるログファイルは

[code]

    **********************
    Windows PowerShell トランスクリプト開始
    (中略)
    **********************
    トランスクリプトが開始されました。出力ファイル:（略）
    HelloWorld
    **********************
    Windows PowerShell トランスクリプト終了
    終了時刻: （略）
    **********************
    
[/code]

と保存されますが、私の希望は実行コマンドもログに保存することです。  
つまり以下のようになってほしいです。

[code]

    **********************
    Windows PowerShell トランスクリプト開始
    (中略)
    **********************
    トランスクリプトが開始されました。出力ファイル:（略）
    PS>Write-Host "Hello World"
    HelloWorld
    **********************
    Windows PowerShell トランスクリプト終了
    終了時刻: （略）
    **********************
    
[/code]

試したこととして、`Set-PSDebug -Trace
1`を記載してみましたが、ストリームには似たような形で表示されるのですが、ログには一切表示されませんでした。

(追記)追加要件になりますが、エビデンス収集に使用したい為、実行コマンドと出力結果を順序通り出力したいと考えています。


CC BY-SA 4.0
2022-06-13T14:29:01.627
89370
2022-06-14T12:40:11.740
2022-06-14T04:34:37.860
53054
53054
question
powershell
PowerShell5.1のスクリプトでStart/Stop-Transcriptでログを保存する時、 実行したコマンド自体をログに書き込みたい


> PowerShell5.1のスクリプトでStart/Stop-Transcriptでログを保存する時、  
>  実行したコマンド自体をログに書き込むことはできないでしょうか。

下記のフォーラムによると、PowerShell5.1と5.0の不具合によりコマンド自体をログに書き込むことができないようです。  
[Start-Transcript コマンドレットでデバッグ
ログが出力されない](https://social.technet.microsoft.com/Forums/azure/ja-
JP/55c4b802-d01f-413f-8b72-041da82c8ca2/starttranscript)

ちなみに力技でスクリプトを保存する方法として、[PowerShell スクリプト
ブロックのログ記録を有効にする](https://docs.microsoft.com/ja-
jp/powershell/scripting/windows-powershell/wmf/whats-new/script-
logging?view=powershell-7.2)方法を使って、全スクリプトログを強制的にイベントログとして保存する方法があります。  
上記のリンク先を引用します。

> ログ記録は、 [管理用テンプレート] -> [Windows コンポーネント] -> [Windows PowerShell] の
> [PowerShell スクリプト ブロックのログ記録を有効にする] グループ ポリシー設定で有効にします。

ログ記録を参照するには「ファイル名を指定して実行」→「eventvwr.msc」などでイベントビューアを開き、左側ツリーで「アプリケーションとサービス ログ
> Microsoft > Windows > PowerShell > Operational」を選択します。  
右側のリストで対象のイベントを選択することで、下記のような形で実行結果を得られます。  
ただし実行結果は保存されません。

[code]

    Scriptblock テキストを作成しています (1 個中 1 個目):
    Write-Host "Hello World" 
    
[/code]

下記のPowerShellスクリプトで10分以内のイベントを取得することもできます。

[code]

    Get-WinEvent Microsoft-Windows-PowerShell/Operational | where Id -eq 4104 | where TimeCreated -ge $(date).AddMinutes(-10) | Format-Table -AutoSize -Wrap
    
[/code]


CC BY-SA 4.0
2022-06-14T01:50:26.547
89378
2022-06-14T01:50:26.547
9820
89370
answer


もし「絶対に実行した記録でなければいけない」という考えがあったとしても、その部分を妥協できて、人間が見て識別できるような何かがあれば良いのであれば、実行予定のコマンドとパラメータを表す文字列として事前に表示するスクリプトの行を追加する方法で代替出来るのでは？

例えばこんな風に記述してみるとか：

[code]

    Start-Transcript
    Write-Host "PS>Write-Host ""Hello World"""
    Write-Host "Hello World"
    Stop-Transcript
    
[/code]

良くあるようにカレントディレクトリも表示するプロンプトならば以下のようにすれば良いでしょう。

[code]

    Write-Host "PS $PWD>Write-Host ""Hello World"""
    
[/code]

* * *

その後続けて調べていたらこんな記事を見つけました。  
[PowerShell script, showing commands run](https://serverfault.com/q/102098)  
承認された回答はありませんが、この行が応用できるかもしれません。  
スクリプトファイルの内容を読み込んでパイプに流し、`invoke-expression`で実行するという形でしょうか。

>
[code]

>     get-content foo.ps1|foreach-object{$_;invoke-expression "$_"}
>  
[/code]

試しに質問の3行をスクリプトにして実行してみたら、`Write-Host`の行もファイルに書き出されました。

ただし回答には複数行に分かれた記述は失敗すると書かれています。他にも色々と制約は出てきそうですね。

> The problem with the above is that if you have multi-line commands like
> this:
[code]

>     foreach($proc in $procs){
>       $proc.processname
>     }
>  
[/code]

>
> The above will fail with my example above if that's placed in foo.ps1 with
> that structure...

試してみてください。


CC BY-SA 4.0
2022-06-14T07:41:20.283
89384
2022-06-14T12:36:06.923
2022-06-14T12:36:06.923
26370
26370
89370
answer


> PowerShell5.1のスクリプトでStart/Stop-Transcriptでログを保存する時、  
>  実行したコマンド自体をログに書き込むことはできないでしょうか。

`Start/Stop-
Transcript`でログを書く方法ではありませんが、スクリプトを`powershell‘に読み込ませて実行する方法はいかがでしょうか？

スクリプト q.ps1

[code]

    Write-Host "Hello World"
    
[/code]

実行方法

[code]

    type .\q.ps1 | powershell -File -  > log.txt
    
[/code]

log.txtの内容

[code]

    PS D:\junc\ps> Write-Host "Hello World"
    Hello World
    PS D:\junc\ps> 
    
[/code]


CC BY-SA 4.0
2022-06-14T12:40:11.740
89387
2022-06-14T12:40:11.740
35558
89370
answer