管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

Copy-ItemやRemove-Itemの「-Verbose」をファイル出力する場合は「4>&1」とリダイレクトする

Powershellでファイルコピーや削除を行う際、「-Verbose」で対象を表示し、それをファイルにも書き込みたかったのですがうまくいかず、試行錯誤したメモ。

実行環境

PS C:\Users\hoge\Desktop\verbose> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22621.963

ソースコード

# copy.ps1
function Main(){
    $copy_from = "C:\Users\hoge\Desktop\verbose\files\A"
    $copy_to = "C:\Users\hoge\Desktop\verbose\files\B"

    $files = Get-ChildItem -Path $copy_from -File

    foreach($file in $files){
        Copy-Item -Path $file.FullName -Destination $copy_to -Verbose 4>&1 |` # 「4>&1」のところがポイント
        Tee-Object -FilePath "copy.log" -Append  # 標準出力とファイルに出力したかった
    }
}

Main

実行結果

リダイレクトなし→失敗

PS C:\Users\hoge\Desktop\verbose> .\copy.ps1
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\1.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\1.txt" に対して操作 "ファイルのコピー" を実行しています。
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\2.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\2.txt" に対して操作 "ファイルのコピー" を実行しています。
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\3.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\3.txt" に対して操作 "ファイルのコピー" を実行しています。


PS C:\Users\hoge\Desktop\verbose> ls


    ディレクトリ: C:\Users\hoge\Desktop\verbose


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/05/17     23:33                files
-a----        2023/05/17     23:41            357 copy.ps1 ←同階層に「copy.log」が出力されず

2>&1でリダイレクト→失敗

PS C:\Users\hoge\Desktop\verbose> .\copy.ps1
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\1.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\1.txt" に対して操作 "ファイルのコピー" を実行しています。
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\2.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\2.txt" に対して操作 "ファイルのコピー" を実行しています。
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\3.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\3.txt" に対して操作 "ファイルのコピー" を実行しています。
PS C:\Users\hoge\Desktop\verbose> ls


    ディレクトリ: C:\Users\hoge\Desktop\verbose


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/05/17     23:33                files
-a----        2023/05/17     23:42            362 copy.ps1 ←同階層に「copy.log」が出力されず

4>&1でリダイレクト→成功

PS C:\Users\hoge\Desktop\verbose> .\copy.ps1
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\1.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\1.txt" に対して操作 "ファイルのコピー" を実行しています。
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\2.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\2.txt" に対して操作 "ファイルのコピー" を実行しています。
詳細: 対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\3.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\3.txt" に対して操作 "ファイルのコピー" を実行しています。
PS C:\Users\hoge\Desktop\verbose> ls


    ディレクトリ: C:\Users\hoge\Desktop\verbose


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/05/17     23:33                files
-a----        2023/05/17     23:42            806 copy.log ←ログが出力された
-a----        2023/05/17     23:42            362 copy.ps1


PS C:\Users\hoge\Desktop\verbose> cat .\copy.log
対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\1.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\1.txt" に対して操作 "ファイルのコピー" を実行しています。
対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\2.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\2.txt" に対して操作 "ファイルのコピー" を実行しています。
対象 "項目: C:\Users\hoge\Desktop\verbose\files\A\3.txt コピー先: C:\Users\hoge\Desktop\verbose\files\B\3.txt" に対して操作 "ファイルのコピー" を実行しています。

参考リンク

learn.microsoft.com