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" に対して操作 "ファイルのコピー" を実行しています。