サバのトランク

コンピュータの記事を中心に

バッチファイルによるバックアップ ④ EXTRA File と画面の整列

モニタを見つめる少年

【訂正】2024/8/28に内容を一部訂正しました。(ログファイルをフルパスで記述)

2024年4月に、
『バッチファイルとタスクスケジューラによるデータバックアップ手法 ①、②』
8月に続きとして、
『バッチファイルによるデータバックアップ③ 「ログファイル」を残す』
という、3つの記事を書いてきました。

今回はその続きと補足の「記事 ④」 として、"EXTRA File" の説明と、出力画面・ログファイルの整列についてです。

 

前回の「記事③」で作ったバッチファイル

前回の「記事③」では、D:\サバdataフォルダを、D:ドライブから、E:ドライブにバックアップする下記のバッチファイルを作成しました。⬇️
この例では、"/MIR" オプションが付いているので、ファイルはミラーリング(コピー元とコピー先は一致)されます。

------- この下の行からコピー -------
robocopy d:\サバdata e:\サバdata /MIR /FFT /XO /XA:SH /R:0 /W:0 /NP /LOG:D:\サバBackUp.Log /TEE /NDL
pause
------ この上の行までコピー --------

 

「メモ帳」でバッチファイル作成時の重要な注意点

「メモ帳」を使って、バッチファイルを作成する場合に非常に重要な注意点があります。
バッチファイルに記述されたフォルダ名ファイル名「全角文字」(漢字、ひらがな、カナカナ)が含まれている場合(この記事の例もあてはまる)には、保存するときに、
「名前を付けて保存」を選び、右下の「保存」ボタンの左側にあるエンコードANSIを選んでください。⬇️
そうしないと、漢字などが文字化けしてしまい、バッチファイルが正しく動作しません。(「文字コード」の違いから起こるエラーです)
すべて、半角(英数字文字)の場合には、そのままUTF-8でも問題ありません。

保存時はANSIで

テキストファイルが完成したら、その後拡張子( "." (ドット)より後の文字)を "txt" から ”bat" (または "cmd" )に変更してください。

(例えば、"savaBackUp.bat" などというファイル名にするということです。)
(拡張子などの詳細や、バッチファイルの編集方法などについては「記事①」を参照してください)⬇️

savatrunk.com

★★★

(この、"ANSI" で保存する操作は、この記事の後半で出てくる、「英語モード」では不要になります。「英語モード」にするために "chcp 65001" コマンドを使って、文字コード"Unicode" に変更したことにより、"UTF-8" の文字が問題なく認識されるためだと思います)

英語モードの方が日本語が文字化けしないって、なんだかな~🙄

 

EXTRA Fileとは

例えば、コピー元(D:)コピー先(E:)のファイルが、下記のような状態にあったとします。⬇️

ファイルの配置

これは、以前コピー先(E:)にバックアップはしていたが、その後コピー元(D:)では、
プレアデス星団.jpg」と「saturn-rings-2.jpg」は削除した。
「jupiter-seb.jpg」という新しいファイルを追加した。
という状態になっています。

プレアデス星団.jpg」と「saturn-rings-2.jpg」は、コピー先(E:) にしかなくバックアップする必要のないファイルです

ここで、先ほどのバッチファイルを実行(普通にマウスでクリック)すると、コマンドプロンプトの黒いウィンドウが開き、以下のような内容が出力されます。⬇️

EXTRAファイルが表示された画面

ログファイルである "サバBackUp.Log" の内容も同じく⬇️

EXTRAファイルがあるログファイル

となります。

どちらも同じですが、「saturn-rings-2.jpg」「プレアデス星団.jpg」の左側に、"EXTRA File" と表示されています。
これは、バックアップする必要のない「余分な(Extra)ファイル」ということを示しています。
「jupiter-seb.jpg」は「新しいファイル」として、バックアップされます。

 

/MIR と /E オプションによる結果の違い

結果を見てみると、"/MIR" オプションが付いているので、ファイルはミラーリング(コピー元とコピー先は一致)されます。すなわち「コピー先」の余分な "EXTRA File" は削除されることになります。⬇️

ミラーリングの結果

 

"/MIR" オプションには注意が必要!

"/MIR" オプションの使用には注意してください。

コピー元でファイルを消してしまった時、バックアップ先にあるから大丈夫と思っていても、どこかのタイミングでこのミラーリング」のバックアップをしてしまうと、バックアップ先のファイルも消えてしまいます。

次に示す "/E" オプション(追記するモード)を使った方が「安全」だとはいえます。ただし、ファイルは増える一方となるので、バックアップ先のディスク容量がより必要となります。


"/E" オプション

"/MIR" オプションの部分を "/E"に変更すると、コピー元で削除したファイルもコピー先には残ります(追記する形でコピー)。

------- この下の行からコピー -------
robocopy d:\サバdata e:\サバdata /E /FFT /XO /XA:SH /R:0 /W:0 /NP /LOG:D:\サバBackUp.Log /TEE /NDL
pause
------- この上の行までコピー -------

 実行結果はこうなります。⬇️

追記の結果

 

"/E" オプションは、「空のディレクトリ(フォルダ)を含むサブディレクトリもコピーする」というオプションで、"/MIR" はその機能も含んでいるので、どちらかを選べばよいということになります。

 

画面とログファイルの表示のズレ

次に、見た目の話です。
robocopyコマンドを使った、結果の出力を見ると⬇️

表示が乱れた出力画面

赤枠・赤線の部分の文字表示がずれていて非常に見づらいです。下の一番右側など、"Extras" の下に 0, 2 などの数字が来るはずですが、失敗したファイルが2つあるように見えてしまっています。

実は、本来の英語モードであれば、きれいに整列しているんです。⬇️

英語モードで整列した画面

こんなにきちんと揃うんですね。今まで見ていたのは何だったんだ!
英語にはなりますが、Total, Copied,  ・・・ Extras のファイル数なども非常に見やすくなっています。

 

英語モードにして整列させる

では、英語モードにして、画面表示を整えたいと思います。

コマンドプロンプトでは、日本語の場合、932(shift_jis)というコードページ(PCで使う文字を符号化するシステム)が使われています。
これを Unicodeである、65001(utf-8に変更すると robocopyコマンドを英語表示させることができます。

 

バッチファイル作成

これまでのバッチファイルを改良していきます。
まず、1行目に、コードページを変更するコマンド "chcp" (change code page)を使った、
"chcp 65001" を加えます。

robocopyコマンドのオプションには、 Unicode 文字としてログファイルに出力を書き出すために、これまでの "/LOG:" ではなく、

"/UNILOG:<ログファイル名>" を使います。

英語モードのバッチファイルはこうなります。⬇️

(英語モード、ミラーリング、ログファイル上書き)
------- この下の行からコピー -------
chcp 65001
robocopy d:\サバdata e:\サバdata /MIR /FFT /XO /XA:SH /R:0 /W:0 /NP /UNILOG:D:\サバBackUp.Log /TEE /NDL 
pause
------- この上の行までコピー -------

 

バッチファイル実行

英語モードのバッチファイルを実行してみます。

ログファイルは英語モードできれいに記録されていました。日本語のファイル名等も文字化けはありません。⬇️

英語モードログファイル

 

画面表示の方では、なぜか、日本語のログファイル名 "サバBackUp.Log" の "サバ" の部分だけが文字化けしています。⬇️

英語モードログファイル名文字化け

フォルダ名やファイル名の日本語は大丈夫なのに、ログファイル名だけが文字化けしているのは謎ですね🤔

色々試してみましたが、この部分の解決はできませんでした。

 

ログファイル名を英語にする

ならば、ログファイル名に日本語を入れなければ大丈夫でしょう。
ログファイル名を "SavaBackUp.Log" としてみました。⬇️

英語ログファイル名で文字化け無し

無事、文字化けせずに表示されました

 

ログファイルの「上書き」と「追記」

"/UNILOG:" オプションですが、そのままの

"/UNILOG:<ログファイル名>" であれば、既存の「ログファイル」は毎回「上書き」されます。

"/UNILOG" の後に "+" を付けて、

"/UNILOG+:<ログファイル名>" とすれば、既存の「ログファイル」「追記」されます。

 

とりあえず完成

これで、一応バックアップを行うのに必要な機能を持ったバッチファイルが完成しました。

オプションで動作が変わりますが、2つの例を改めて載せておきます。⬇️

(日本語モード、ミラーリング、ログファイル上書き)
------- この下の行からコピー -------
robocopy d:\サバdata e:\サバdata /MIR /FFT /XO /XA:SH /R:0 /W:0 /NP /LOG:D:\サバBackUp.Log /TEE /NDL
pause
------ この上の行までコピー --------

赤字で示したオプションは、下記それぞれどちらかを選択する。
・"/MIR"(ファイルをミラーリング)or "/E"(ファイルを追記)
"/LOG:"(ログファイルを上書き)or "/LOG+:"(ログファイルを追記)


(英語モード、ファイル追記、ログファイル追記)
------- この下の行からコピー -------
chcp 65001
robocopy d:\サバdata e:\サバdata /E /FFT /XO /XA:SH /R:0 /W:0 /NP /UNILOG+:D:\サバBackUp.Log /TEE /NDL 
pause
------- この上の行までコピー -------

赤字で示したオプションは、下記それぞれどちらかを選択する。
・"/MIR"(ファイルをミラーリング)or "/E"(ファイルを追記)
・"/UNILOG:"(ログファイルを上書き)or "/UNILOG+:"(ログファイルを追記)

 
当然ですが、コピー元(d:\サバdata) 、コピー先(e:\サバdata)、ログファイル名D:\サバBackUp.Log)はそれぞれの利用環境に応じて変更してください。

 
完成したバッチファイルを、時刻等を指定してバックアップを自動実行したい場合は、「記事②」を参照して、タスクスケジューラを利用してみてください。
また、バッチファイルの作り方や、robocopyコマンドのオプションの詳細などについては「記事①」を参照してください。

 

"/UNILOG+:" を使ってログファイルを作るときの注意点

英語モードで"/UNILOG+:" を使ってログファイルを作るときに注意を要する点があります。

英語モード("chcp 65001" 使用)で "/UNILOG+:" を使う場合、既存のログファイルが存在せず、新規に作成される場合には、フォルダ名・ファイル名の日本語部分が表示されていない状態になってしまうという問題を見つけました。
コマンドプロンプトの画面表示は問題なし)

回避方法は、最初に「上書きモード」の "/UNILOG:" を使ってログファイルを一旦作成しておくことです(この場合、日本語フォルダ名・ファイル名は問題無し)。

次のバックアップの時から "/UNILOG+:" を使って追記していけば、日本語フォルダ名・ファイル名がきちんと表示されたログファイルが保存されます。

⬇️上が日本語が表示されなかった例、下は上記の方法で問題を回避した場合

日本がファイル名が表示されない

最初のうちは、日本語フォルダ名・ファイル名が、消えたり・表示されたりと再現性がわからず悩みましたが、上記の条件で再現性はあります。理由にいつては、モードが変わったとしか私にはわかりません。🙄

これで、ログファイル名の画面表記以外は文字化けしなくなりましたが、どうもすっきりしない感じも残ります。

この記事を書くにあたって、英語モードや文字化けについて参考にさせて頂いたページがあるのですが、そのページの管理人さんも日本語の表示についてはやはり疑問を投げかけています。⬇️

Robocopyを英語表示にしてログ表示の桁ずれをなくす

 

残りの気になる点

文字コードに関する「文字化け」の件はだいたいわかってきましたが、他に気になる点がひとつ残っています。

画面・ログファイル共にですが、最後の部分に "Speed"(転送速度)の2行が表示されたり、されなかったりします。
転送するファイルのトータルのサイズが小さいときは表示されないようですが、どこにもそのあたりの記述が無く、詳細は不明です。もう少し調べてみます。

 

まとめ

前回の「記事③」robocopyコマンドを使って、ログファイルを残す形のバッチファイルを作成しました。
今回の「記事④」では、補足説明と、英語モードを使っての出力の整列を行いました。

というわけで、robocopyコマンドを使う場合は、画面やログファイルが見にくくてもかまわなければ日本語モードのままで、整列させたければ英語モードで試してみてください。

ただし、日本語モードでもコピーするフォルダ名やログファイル名に日本語が入っている場合には、バッチファイルを "ANSI" で保存する必要があります。(この記事の冒頭の『「メモ帳」でバッチファイル作成時の重要な注意点』参照)

英語モードでは、ログファイル名に日本語を使っていると文字化けが起こります。

また、"UNILOG+:" を使う時には、前もってログファイルを用意しておくことが必要な点にも注意してください。

 

本当はわざわざ英語モードなんかで動かさなくても、普通に日本語モードで画面が崩れずに表示されれば問題ないわけで、Microsoftが直してくれればそれで終わりの話なんですけどね。
まあ、robocopyコマンドの見た目の改善なんて、ものすご~く優先順位の低い作業なんでしょうが・・・

robocopyコマンドを使った「バッチファイルとタスクスケジューラによるデータのバックアップ」シリーズは今回で終了の予定です。
バッチファイルやコマンドなどは、なかなか敷居が高いという方も多いかもしれませんが、どなたかのお役に立てば。😃

 

2024/8/28に内容を一部訂正しました。(ログファイルをフルパスで記述等の詳細はこちらの記事参照)この記事の内容は訂正済みです。⬇️

savatrunk.com

 

⬇️『バッチファイルとタスクスケジューラによるデータバックアップ手法 ①』

⬇️『バッチファイルとタスクスケジューラによるデータバックアップ手法 ②』

⬇️『バッチファイルによるデータバックアップ③ 「ログファイル」を残す』