別の記事 「Robocopyを英語表示にしてログ表示の桁ずれをなくす」 の中で、コードページをUTF8にして、Robocopyを英語表記にするという記事を書きました。その際、コードページをUTF8にしても、日本語ファイル名や年月日を正しく表示できる方法がないか、いろいろと試行錯誤をしました。
/UNICODE、/UNILOG、/LOGなどのログ関連のオプションが指定された時、どのような文字コードが出力されているか、また、コードページがshift_jisの場合とUTF8の場合それぞれについてどうか、について実際に実験してみたので、その結果を以下にまとめます。
結果をご覧いただく前に、少しだけ、Robocopyのログ出力における文字コードの問題の深刻さについて少し説明しておきたいと思います。
今回の調査にあたっては、特に、UNICODE系のオプションについて、明らかにおかしい動作が見られたので、そのあたりを中心に調べています。
これは /UNICODE の実行例です。
最初にUTF-16のBOMを付けているにもかかわらず、本文ほぼ全体がUTF-16で決められた2バイト単位のコードになっていません。年月日やファイル名は全てUTF-8になっています。不思議なことに、Option文字列を表示している箇所のみ、本来のUTF-16の2バイト単位のコードになっています。全く不整合だらけで、ひどい状況です。
各ログ出力コマンドについて、out.log ファイルに出力される文字コードを調べた結果を以下にまとめました。表の緑色の部分は、出力の文字コードが一貫していて正常だと思われる部分です。
ログ出力コマンド | コードページ: shift_jis (932) (robocopyは日本語表示) |
コードページ: UTF8 (65001) (robocopyは英語表示) |
||||
---|---|---|---|---|---|---|
BOM | 出力コード状況 | 正常性 | BOM | 出力コード状況 | 正常性 | |
robocopy > out.log | 無し | shift_jis | 〇 | 無し | ファイル名:shift_jis 年月日の文字:UTF8 | × |
robocopy /UNICODE > out.log | UTF16 (FF FE) |
shift_jis (Option部分のみUTF-16) | × (BOMとコードが合ってない) | UTF16 (FF FE) |
UTF-8 (Option部分のみUTF-16) | × (BOMとコードが合ってない) |
robocopy /UNILOG:out.log | UTF16 (FF FE) |
UTF-16 | 〇 | UTF16 (FF FE) |
UTF-16 | 〇 |
robocopy /UNILOG+:out.log | 無し | shift_jis | 〇 (Unicodeになっていない) | 無し | ASCII文字しか表示されない。日本語文字が削除されている。 | × |
robocopy /UNILOG:NUL /TEE > out.log | 無し | shift_jis | 〇 (Unicodeになっていない) | 無し | UTF-8 | 〇 |
robocopy /UNILOG+:NUL /TEE > out.log | 無し | shift_jis | 〇 (Unicodeになっていない) | 無し | UTF-8 | 〇 |
robocopy /LOG:out.log | 無し | shift_jis | 〇 | 無し | ファイル名:shift_jis 年月日の文字が削除されている |
× |
robocopy /LOG+:out.log | 無し | shift_jis | 〇 | 無し | ファイル名:shift_jis 年月日の文字が削除されている |
× |
robocopy /LOG:NUL /TEE > out.log | 無し | shift_jis | 〇 | 無し | ファイル名:shift_jis 年月日の文字:UTF8 |
× |
robocopy /LOG+:NUL /TEE > out.log | 無し | shift_jis | 〇 | 無し | ファイル名:shift_jis 年月日の文字:UTF8 |
× |
分かったことを簡潔にまとめると以下の通りです。
まず、全体として、UNICODE系のオプションの動作はとてもおかしいです。冒頭で説明したように、特に、/UNICODE オプションは、文字コードが混在するなど、動作が明らかにおかしいです。/UNICODE は使うべきではないと思われます。
/UNILOG:<logfile> については、正常に UTF-16で出力されています。ただ、今どき、UTF-16でファイルを作成したいと思うことはあまりないのではないかと思われ、使われるケースは少ないのではないかと思います。
また、/UNILOG+ についても動作が全くおかしく、使用するべきではなさそうです。そもそも、/UNILOG と /UNILOG+でこんなに挙動が異なるというのも不思議です。
次に、コードページをUTF8にした場合ですが、これについても全体的に挙動はおかしくなります。唯一、 "/UNILOG:NUL /TEE" オプションを付けた場合のみ、正しくUTF-8(BOM無し)で出力できているようです。従って、Robocopyを正しく英語表記にするためには、「コードページ UTF8 + "/UNILOG:NUL /TEE"オプション」 と設定する必要があります。
/LOG オプションについては、コードページ shift_jis (932) では正しく動作しています。コードページ UTF8(65001)では正しく動作しません。
通常使っている分には、以下のポイントだけ覚えておけばよいのではないでしょうか。
RoboSync: RobocopyのためのGUIツール
本サイトで公開しているツールです。ダウンロードはこのバナーをクリック!
Version 1.3.27 をリリースしました! (2021/1/1)
RobocopyをGUIから実行できるようにするツールです。コマンドプロンプトを表示することなく、GUI画面からほぼマウス操作だけで実行までできます。
Robocopyがバックグラウンドでそのまま実行されますので設定に迷うことはありません。
・ 複数のコピー項目の作成と管理。
・ スクリプトファイル(バッチファイル)出力が可能。スケジューラによるバックグラウンド処理にも使えます。
・ Robocopyによるコピー実行前に、実行プレビュー(/L)、パラメータのチェック(/QUIT)が可能。
・ Robocopyのパラメータ設定の簡易チェック、Robocopy実行前の簡易チェックを行います。
・ Robocopy実行前後で実行するスクリプトを定義可能。
・ Robocopy実行途中での中断、実行ログの履歴管理と保存が可能。
【関連記事・関連コンテンツ】