2016-11-22 285 views
4

robocopyは、lastwrittendateとfilesizeが同じファイルを無視します。 このデザインからどのようにエスケープできますか?私はrobocopyで強制的に上書きしたいと思います。robocopyでファイルを上書きする方法を教えてください

dst \ sample.txtはtest001と書かれているはずです。 しかし、これらのファイルはrobocopyによって同じファイルとして認識され、上書きされません。 "/ IS"オプションはこの場合有効ではありません。 documentationから

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

/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 

This answer選択パラメータが一致したファイルの種類の良い説明があります。

あなたが記述した動作を再現することができましたが、私のテストで生成されたドキュメントと出力robocopyの理解から、これはバグだと考えています。

PS C:\temp>New-Item src -Type Directory >$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 
... 
    Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30 

------------------------------------------------------------------------------ 

          1 C:\temp\src\ 
      Modified 7 sample.txt 

------------------------------------------------------------------------------ 

       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :   1   0   0   0   0   0 
    Files :   1   1   0   0   0   0 
    Bytes :   7   7   0   0   0   0 
... 
PS C:\temp>robocopy src dst sample.txt /is /it /copyall /mir 
... 
    Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30 

------------------------------------------------------------------------------ 

          1 C:\temp\src\ 
      Same 7 sample.txt 

------------------------------------------------------------------------------ 

       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :   1   0   0   0   0   0 
    Files :   1   1   0   0   0   0 
    Bytes :   7   7   0   0   0   0 
... 
PS C:\temp>Get-Content .\src\sample.txt 
test001 
PS C:\temp>Get-Content .\dst\sample.txt 
test002

ファイルコピーとしてリストされ、それは、少なくとも時間が同期され後に同じファイルrobocopyランなるのでれます。ただし、出力に応じて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 
... 
    Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30 

------------------------------------------------------------------------------ 

          1 C:\temp\src\ 
100% Newer 7 sample.txt 

------------------------------------------------------------------------------ 

       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :   1   0   0   0   0   0 
    Files :   1   1   0   0   0   0 
    Bytes :   7   7   0   0   0   0 
... 
PS C:\temp>Get-Content .\dst\sample.txt 
test001

アン確かに醜い回避策は、データをコピーするrobocopyを強制するために微調整/同じファイルの最終書き込み時刻を変更するには、次のようになります。xcopyへの切り替え

& 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 src dst /k/r/e/i/s/c/h/f/o/x/y 
+0

OKです。私はxcopyを使用します。 – tbl

0

これは、すべてのフォルダが対応するユーザーのデスクトップにあるホームフォルダに対して実行しました。適切な権限を持っているため、ユーザーはそこにいても表示されません。だから私は、右の設定でファイルを上書きするパラメータとの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 

あなたは私が(念のため)無視するように設定され、多くの種類のファイルがあります見ての通り、ちょうどあなたのニーズやごのためにそれらを設定しますケースシナリオ。

サーバー2012でテストされたすべてのスイッチは、マイクロソフトのサイトなどで文書化されています。

+0

こんにちは、ようこそ。あなたの答えを編集してわかりやすくしましたが、これがあなたの意図したものかどうかはわかりません。とにかくあなたのシナリオを説明しましたが(私は本当に理解していません、申し訳ありませんが)、あなたのコマンドが何をしているのか説明していないし、複雑なものなので、私はあなたの答えを[編集]することを提案し、少なくともこのコマンドが何をどのようにしているのかを一般的に説明します。 Robocopyに同じように見えるファイルを上書きするように強制する方法については、元の質問に答えていますか? –

関連する問題