web-dev-qa-db-ja.com

Robocopyにファイルを上書きさせるにはどうすればよいですか?

一般に、Robocopyはlastwrittendateとfilesizeが同じファイルを無視します。この設計からどのように逃れることができますか? Robocopyで強制的に上書きしたいと思います。

Dst\sample.txtはtest001と書かれているはずです。ただし、これらのファイルはRobocopyによって同じファイルとして認識され、上書きされません。この場合、「/ IS」オプションは無効です。

New-Item src -itemType Directory
New-Item dst -itemType Directory
New-Item src\sample.txt -itemType File -Value "test001"
New-Item dst\sample.txt -itemType File -Value "test002"
Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"

ROBOCOPY.exe src dst /COPYALL /MIR
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002

ROBOCOPY.exe src dst /COPYALL /MIR /IS
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002
11
tbl

ドキュメント から:

/is同じファイルが含まれます。 /it「微調整された」ファイルを含みます。

「同じファイル」とは、同一のファイル(名前、サイズ、時間、属性)を意味します。 「微調整されたファイル」とは、名前、サイズ、時間は同じだが属性が異なるファイルを意味します。

robocopy src dst sample.txt /is      # copy if attributes are equal
robocopy src dst sample.txt /it      # copy if attributes differ
robocopy src dst sample.txt /is /it  # copy irrespective of attributes

この回答 スーパーユーザーには、選択パラメーターが一致するファイルの種類についての適切な説明があります。

そうは言っても、説明した動作を再現することはできますが、テストで生成されたドキュメントと出力robocopyの理解から、これをバグと見なします。

PS C:\ temp> New-Item src-タイプディレクトリ> $ null
 PS C:\ temp> New-Item dst -Type Directory> $ null
 PS C:\ temp> New-Item src\sample.txt -Type File -Value "test001"> $ null
 PS C:\ temp> New-Item dst\sample.txt -Type File -Value "test002"> $ null
 PS C:\ temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
 PS C:\ temp> Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
 PS C:\ temp> robocopy src dst sample.txt/is/it/copyall/mir
 ... 
オプション:/ S/E/COPYALL/PURGE/MIR/IS/IT/R:1000000 /W:30

--- -------------------------------------------------- ------------------------- 
 
 1 C:\ temp\src\
 変更された7 sample.txt
 
 ---------------------------------------- -------------------------------------- 
 
合計 コピー済み   スキップされた不一致FAILED Extras 
 Dirs:1 0 0 0 0 0 
 Files:1 1         0 0 0 0 
バイト:7 7         0 0 0 0 
 ... 
 PS C:\ temp> robocopy src dst sample.txt/is/it/copyall/mir
 ... 
オプション:/ S/E/COPYALL/PURGE/MIR/IS/IT/R:1000000 /W:30

--- -------------------------------------------------- ------------------------- 
 
 1 C:\ temp\src\
 同じ7 sample.txt
 
 ---------------------------------------- -------------------------------------- 
 
合計 コピー済み   スキップされた不一致FAILED Extras 
 Dirs:1 0 0 0 0 0 
 Files:1 1         0 0 0 0 
バイト:7 7         0 0 0 0 
 ... 
 PS C:\ temp> Get-Content。\ src\sample.txt
 test001 
 PS C:\ temp> Get-Content。\ dst\sample.txt
 test002

ファイルはコピーされたものとしてリストされ、同じファイルafterになるため、少なくとも最初のrobocopy runは同期されます。ただし、出力に従って7バイトがコピーされたとしても、データフラグが設定されているにもかかわらず(/copyall)。データフラグが明示的に設定されていても、動作は変わりません(/copy:d)。

実際にデータを同期するには、robocopyを取得するために最後の書き込み時間を変更する必要がありました。

PS C:\ temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value(Get-Date)
 PS C:\ temp> robocopy src dst sample.txt/is/it/copyall/mir
 ... 
オプション:/ S/E/COPYALL/PURGE/MIR/IS/IT/R:1000000 /W:30

--- -------------------------------------------------- ------------------------- 
 
 1 C:\ temp\src\
100%新しい7 sample.txt
 
 ---------------------------------------- -------------------------------------- 
 
合計 コピー済み   スキップされた不一致FAILED Extras 
 Dirs:1 0 0 0 0 0 
 Files:1 1         0 0 0 0 
バイト:7 7         0 0 0 0 
 ... 
 PS C:\ temp> Get-Content。\ dst\sample.txt
 test001

明らかにい回避策は、同じ/微調整されたファイルの最終書き込み時間を変更して、robocopyにデータをコピーさせることです。

& robocopy src dst /is /it /l /ndl /njh /njs /ns /nc |
  Where-Object { $_.Trim() } |
  ForEach-Object {
    $f = Get-Item $_
    $f.LastWriteTime = $f.LastWriteTime.AddSeconds(1)
  }
& robocopy src dst /copyall /mir

xcopy に切り替えるのがおそらく最良のオプションです。

& xcopy src dst /k/r/e/i/s/c/h/f/o/x/y
21
Ansgar Wiechers

これは、すべてのフォルダーが対応するユーザーのデスクトップ上にあり、適切なアクセス許可のないショートカットを介して到達できるホームフォルダーに対してこれを行いました。そこで、Robocopyをパラメーターとともに使用して、正しい設定でファイルを上書きしました。

FOR /F "tokens=*" %G IN ('dir /b') DO robocopy  "\\server02\Folder with shortcut" "\\server02\home\%G\Desktop" /S /A /V /log+:C:\RobocopyShortcut.txt /XF *.url *.mp3 *.hta *.htm *.mht *.js *.IE5 *.css *.temp *.html *.svg *.ocx *.3gp *.opus *.zzzzz *.avi *.bin *.cab *.mp4 *.mov *.mkv *.flv *.tiff *.tif *.asf *.webm *.exe *.dll *.dl_ *.oc_ *.ex_ *.sy_ *.sys *.msi *.inf *.ini *.bmp *.png *.gif *.jpeg *.jpg *.mpg *.db *.wav *.wma *.wmv *.mpeg *.tmp *.old *.vbs *.log *.bat *.cmd *.Zip /SEC /IT /ZB /R:0

ご覧のように、(念のため)無視するように設定したファイルの種類はたくさんあります。ニーズやケースシナリオに合わせて設定してください。

Windows Server 2012でテストされ、すべてのスイッチはMicrosoftのサイトなどで文書化されています。

1
Rickz