番外編:Robocopyログに混ざる「xx.x%」表示

番外編

この記事では番外編として「Robocopyログに混ざる「xx.x%」表示」の説明をします。番外編は何らかの理由で正式記事にはできない記事です。
今回は「Robocopyのログにxx.x%という進捗表示が大量にでて見にくい」という問題点に対し、それを解決する手段がPowerShellによりxx.x%の部分を取り除く処理を書くぐらいしかなく、難易度が高いため本編記事では収録をあきらめました。どうしても「xx.x%表示」を取り除きたいひともいるかもしれないので、この記事を書いています。

Robocopyログに混ざる「xx.x%」とは?

RobocopyはWindowsに標準搭載された高機能なファイルコピーコマンドです。
「重要情報をバックアップで守ろう(Windows実践編)」でもバックアップ手段として紹介しています。
その中で、タスクスケジューラによりrobocopyによるオフラインバックアップを自動的に行う方法を紹介しています。タスクスケジューラで実行するため、すぐに結果を確認することができないため/LOG+オプションを使い実行内容をログファイルとして保存しています。
しかし、このログには「xx.x%」という進捗表示が混ざってしまうことがあります。

たとえば、以下のようなログが出力されます:

この進捗表示は、ログを自動処理するうえで「ノイズ」となり、
バックアップの成否確認やファイル変更の追跡を妨げることがあります。


ログファイルにxx.x%が混ざる理由

Robocopyは元々コマンドプロンプト上での使用を前提としています。
進捗を表す「xx.x%」は、標準出力への進捗バーとして表示されます。

ところが、以下のようにログ出力を行うと:

robocopy "C:\source" "D:\backup" /MIR /LOG+: C:backup_log.txt

環境によってはこの「xx.x%」表示がログファイルにも含まれてしまうのです。

/NPオプション(No Progress)を使っても完全には抑制できないことがあります。
このため、ログファイルを後処理して不要な表示を除去する方法が実用的です。


PowerShellで「xx.x%」行を除去する方法

スクリプトの例

以下は、ログファイルから「xx.x%」で始まる行を取り除くPowerShellスクリプトです:

# 元のログファイル
$inputLog = "C:\Backup\robocopy_log.txt"

# フィルター済みログファイル(新しく作成)
$outputLog = "C:\Backup\cleaned_log.txt"

# 行ごとに読み込み、「xx.x%」の行を除外して書き出し
Get-Content '%LOGFILE%' | Where-Object {$_ -notmatch '^\s*\d{1,3}\.\d{1,3}%%$'} | Set-Content '%CLEANED_LOG%' -Encoding UTF8


スクリプトの説明
  • Get-Content:ログファイルを1行ずつ読み込みます
  • ^\s*\d{1,3}\.\d{1,3}%%$ は以下のような行にマッチします:
    • 任意の空白(\s*
    • 1~3桁の数字(\d{1,3}
    • 小数点と1~3桁の数字(例:.4.02
    • パーセント記号(%% はバッチで % を出すために必要)
    • 行末で終了($
  • Set-Content:フィルター済みのログを新しいファイルに保存します

この方法なら、他のログ内容を保持したまま、進捗行だけを除外できます。


バッチ処理としての活用例

バックアップスクリプトの中で自動的にログをクリーンアップしたい場合は、
以下のようにバッチファイルとPowerShellを組み合わせることもできます。

「重要情報をバックアップで守ろう(Windows実践編)」の「タスクスケジューラによるrobocopyによるオフラインバックアップ」に掲載したバッチファイルの修正版を下記に掲載しておきます。

バッチファイル例(C:\Backup\backup.bat):

@echo off
set LOGFILE=C:\Backup\backup_log.txt
set CLEANED_LOG=C:\Backup\cleaned_log.txt

rem ネットワーク共有への接続

net use Z: \\[コンピュータ名]\[共有名] /user:USERNAME PASSWORD
if errorlevel 1 (
    echo ネットワークドライブ接続失敗
    exit /b 1
)

rem Robocopyを実行
robocopy "C:\Users\[ユーザーアカウント名]\MyDocuments" "Z:\OfflineBackup\MyDocuments" /MIR /R:2 /W:5 /LOG+:%LOGFILE%

rem PowerShellでログをクリーン化
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
 "Get-Content '%LOGFILE%' | Where-Object {$_ -notmatch '^\s*\d{1,3}\.\d{1,3}%%$'} | Set-Content '%CLEANED_LOG%' -Encoding UTF8"

rem ネットワーク共有の切断
net use Z: /delete /yes

注意点

  • ログを後処理するため、ログファイルの保存先パスに注意してください
  • 元ファイルを上書きする場合はバックアップを取っておくのがおすすめです

まとめ

Robocopyのログファイルには、xx.x%の進捗表示が混ざってしまうことがあります。
これは見た目のノイズになるだけでなく、自動処理やログ管理の妨げにもなります。

対策として、PowerShellによるフィルター処理で不要な行を削除すれば、
見やすく信頼性の高いログファイルを保つことができます。

BatchやPowerShellでコーディングしなければならないので、万人向けではないと思いボツにした内容です。コーディングが気にならない方は使ってみてください。

コメント

タイトルとURLをコピーしました