【Windows/robocopy】初心者が勉強した教材やつまずいた箇所まとめ
どうも!新人エンジニアの前歯すきっ歯です🦷
ADサーバとファイルサーバの新規構築&オンプレからの移行案件を担当することになり、
ファイルサーバの移行はrobocopyで行うことになったので勉強を開始しました~🙌
当初は「robocopyとは…?」という理解状況だったので、
勉強の際に使用したリンクやつまずきをまとめて後から見返せるようにします!
初期使用教材
★robocopyとは?
「robocopyとは何?」の段階の時に、1番初めに見ることをお勧め。
robocopyの概念を知ることができます。
やはりテキストより人が話してくれている方が分かりやすい。
★robocopyを試してみた!(基本編)&(実践編)
robocopyを実践する上での基礎を知ることができます。
1つ目はあくまで概念的な部分。手を動かして試す第1歩を以下のリンクがサポートしてくれます。
その他使用リンク
★@Echo offとは
ネット上でよく見かけた”@Echo off”の意味が分からなかったので調べました。
★Windowsのファイルを簡単バックアップ:robocopyコマンド
robocopyでの環境変数やdate変数の使い方が記載されています。
★Robocopyでセキュリティ情報を正しくコピーする方法と注意点
robocopyする時のセキュリティ情報やセキュリティ情報をコピーするための前提条件について詳しく記載されています。
★Robocopyコマンド: /DCOPY:DATのすすめ
/DCOPYに指定するべきオプションとその理由を知ることができます。
★batファイルの作成方法
テクストファイルで書き出したはいいもののどうやってbatファイルにするか分からなかったので
調べました。
実践する中で勉強になったこと
自分の環境で勉強する中で起こったエラーとその解決策をまとめておきます。
1. 前提条件
全体的な構成
AWSにて下図の構成を作成しました。
エラー時のrobocopy実行コマンドと状況
- フォルダ名”RobocopySorce”と”RobocopyDestination”はそれぞれFS03とFS04のCドライブ内に配置してあります。
- 上記2つのフォルダにはファイルを1つずつ入れてあります。
- 当初何も共有設定をしていませんでした。
コマンドは長いのでプルダウンにします。
robocopy実行コマンド
@echo off
echo ########################
echo robocopy Script Start?
echo ########################
pause
echo ########################
echo Robocopy Script Execute!
echo ########################
:: 移行元ファイルサーバを定義
set src_server=\\FS04.(ドメイン名)\
:: 移行先ファイルサーバを定義
set dst_server=\\FS03.(ドメイン名)\
:: 移行元共有ディレクトリを定義
set src_dir=RobocopySorce
:: 移行先共有ディレクトリを定義
set dst_dir=RobocopyDestination
:: 除外ディレクトリを定義
:: set exclusion=
:: ログファイルの出力先を定義
set log=C:\RobocopyLogs\%date:~0,4%-%date:~5,2%-%date:~8,2%_robocopy.log
:: ディレクトリ及びサブディレクトリをコピーする
robocopy %src_server%%src_dir% %dst_server%%dst_dir% /COPYALL /DCOPY:DAT /MIR /B /R:1 /W:1 /IT /PF /NP /LOG+:%log% /SL
:: オプション補足------------------------------------------------
:: ■■■■■■■/COPYALL:『ファイル情報』をセキュリティ情報含めすべてコピー(=/copy:DATSOU)■■■■■■■
::D - データ
::A - 属性
::T - タイム スタンプ
::S - NTFS アクセス制御リスト (ACL)
::O - 所有者情報
::U - 監査情報
::X - 代替データ ストリームをスキップする( /B または /ZB のいずれかが使用されている場合、X フラグは無視される。)
:: ■■■■■■■/DCOPY:DAT :『ディレクトリ』情報をコピー■■■■■■■
::D - データ
::A - 属性
::T - タイム スタンプ
::E - 拡張属性
::X - 代替データ ストリームをスキップする
::
:: ■■■■■■■ /IT:ファイル属性だけが異なるファイルをコピーに含める ■■■■■■■
::タイムスタンプが違くなくてもファイル属性だけが違うならばコピーするということ。
::
::■■■■■■■ /MIR:ディレクトリツリーをミラー化する。■■■■■■■
::例えばコピー元で新しく作成されたファイルをコピーするだけではなく、
::削除されたファイルがあればコピー先でも同様に削除し、コピー元とコピー先を同じ状態にしてくれる。
::なお、/MIRは「/E」と「/PURGE」を合わせたオプション。
::「/E」・・・空のディレクトリを含むサブディレクトリもコピーする
::「/PURGE」・・・既にコピー元に存在しないコピー先のファイル/ディレクトリを削除する。
::
::■■■■■■■ /B:バックアップモードでファイルをコピー■■■■■■■
::簡単に言うとアクセス権が無いファイルでもコピーできる。すべてをコピーする場合には必須。
::
::■■■■■■■ /R:1:失敗したコピーに対する再試行数■■■■■■■
::robocopy実行時にはデフォルトで設定されており、その設定値は1000000回。何かしらの原因でコピーできなかった際の試行回数を指定。
::「別に失敗したらそれでいいよ」の時は1に設定。
::
::■■■■■■■ /W:1:再試行と再試行の間の待機時間■■■■■■■
::単位は「秒」。デフォルトで設定されている値があり、 30秒がデフォルト値。
::もし「/R」と「/W」を指定せずデフォルトのまま実行して、1ファイルでもアクセス拒否等で失敗した場合は
::1000000回×30秒=30000000秒(約347日)という時間をかけて試行を行い、次のファイルコピーに移ることになります。
::
:: ■■■■■■■/PF:実行時間をファイル単位(パス単位ではない)にする■■■■■■■
::
::■■■■■■■ /NP:コピーの完了率を非表示にする。■■■■■■■
::付け忘れるとただひたすら進捗率(0%とか)がたくさん記載されたログとなってしまうのでとても見れるようなログにはならない。
::コマンドプロンプト上で結果を出力して確認する、という場合はなくても問題ない。
::
::■■■■■■■ /SL:シンボリックリンクのリンク先の対象をコピーせずにシンボリックリンクを作成する■■■■■■■
::/SLを指定していないデフォルトの動作は、シンボリックリンクのリンク先のファイルまたはフォルダを追跡しコピー。
::/SLを指定した場合、シンボリックリンクは、シンボリックリンクとしてコピーされます。リンク先のファイルまたはフォルダはコピーされない。
::
::■■■■■■■ /LOG+:ログファイルを"追記"で出力(+がないと上書きになってしまう)■■■■■■■
::
:: --------------------------------------------------------------
echo ########################
echo Robocopy Script End!
echo ########################
2. エラー対応
エラー内容
ログに出されたエラーは以下の通りです。
端的に言うと「ネットワークパスが見つかりません」とのことです。
robocopy実行時エラー
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : 2024115 3:15:12
2024/11/05 03:15:12 ERROR 67 (0x00000043) Getting File System Type of Source \\FS04.(ドメイン名)\RobocopySorce\
The network name cannot be found.
2024/11/05 03:15:12 ERROR 67 (0x00000043) Getting File System Type of Destination \\FS03.(ドメイン名)\RobocopyDestination\
The network name cannot be found.
Source = \\FS04.(ドメイン名)\RobocopySorce\
Dest = \\FS03.(ドメイン名)\RobocopyDestination\
Files : *.*
Options : *.* /S /E /COPYALL /PURGE /MIR /B /NP /IT /PF /R:1 /W:1
------------------------------------------------------------------------------
NOTE : Security may not be copied - Source might not support persistent ACLs.
NOTE : Security may not be copied - Destination might not support persistent ACLs.
2024/11/05 03:15:12 ERROR 67 (0x00000043) Accessing Source Directory \\FS04.(ドメイン名)\RobocopySorce\
The network name cannot be found.
エラー対策の際に参考にしたリンク
以下のリンクの1つ目の解決策を実践しました。
エラー原因
-
移行先のCドライブに共有設定がされていなかった。
”FS03.(ドメイン名)”をFS04のエクスプローラーに入れるとFS03にアクセスできるが、
それより下の階層にはいけなかった。Cドライブに共有設定がされていないから
ネットワーク上でパスがないという意味で「ネットワークパスが見つかりません」と
エラーが出たようです。 -
ドライブを共有するとスクリプト内でCドライブの後ろに”$”を入れる必要がある。
以下リンク参照。
https://xtech.nikkei.com/it/article/COLUMN/20060628/241956/
上記リンク先の通り実際にコマンドプロンプトでnet shareを叩いていてみると、
共有名とローカルPC内での実態の違いが分かりやすかったです。
C:\Users\Administrator.(ドメイン名)>net share
Share name Resource Remark
-------------------------------------------------------------------------------
C$ C:\ Default share
IPC$ Remote IPC
ADMIN$ C:\Windows Remote Admin
The command completed successfully.
3. エラー対応後のスクリプト
robocopyエラー対応後スクリプト(変更点のみ抜粋)
:: 既存ファイルサーバを定義
set src_server=C:\
:: 新ファイルサーバを定義
set dst_server=\\FS03.kokusai.kcp.co.jp\
:: 移行元共有ディレクトリを定義
set src_dir=RobocopySorce
:: 移行先共有ディレクトリを定義
set dst_dir=C$\RobocopyDestination
Discussion