Я где-то читал, что Robocopy по умолчанию пропускает копирование существующих файлов.
Но... Я не могу найти переключатели командной строки для этого.
Я где-то читал, что Robocopy по умолчанию пропускает копирование существующих файлов.
Но... Я не могу найти переключатели командной строки для этого.
robocopy SOURCE DESTINATION FILE(S) /IS
Где IS
означает, что я включаю файл (ы)S ame. Использование этого переключателя приводит к перезаписи существующих файлов. Увидеть ниже:
::
:: File Selection Options :
::
/A :: copy only files with the Archive attribute set.
/M :: copy only files with the Archive attribute and reset it.
/IA:[RASHCNETO] :: Include only files with any of the given Attributes set.
/XA:[RASHCNETO] :: eXclude files with any of the given Attributes set.
/XF file [file]... :: eXclude Files matching given names/paths/wildcards.
/XD dirs [dirs]... :: eXclude Directories matching given names/paths.
/XC :: eXclude Changed files.
/XN :: eXclude Newer files.
/XO :: eXclude Older files.
/XX :: eXclude eXtra files and directories.
/XL :: eXclude Lonely files and directories.
/IS :: Include Same files.
/IT :: Include Tweaked files.
К сожалению, официальная документация не описывает логику того, какие файлы пропускаются по умолчанию.
Неофициальная документация ss64.com, тем не менее, содержит ключевой указатель (выделение добавлено):
По умолчанию Robocopy будет копировать файл только в том случае, если источник и место назначения имеют разные метки времени или разные размеры файлов.
Примечание: отметка времени относится к отметке времени последнего изменения (только).
Другими словами: Robocopy рассматривает два файла как одинаковые, основываясь только на том, идентичны ли их последние измененные метки времени и размеры файлов, и поэтому в этом случае копирование пропускается .
Из того, что я могу сказать:
На это поведение не влияет изменение аспектов файла / каталога для копирования (параметры /COPY
/ DCOPY
)
Если вы хотите расширить обнаружение одинаковости по умолчанию (с той же самой отметкой времени последнего изменения и с тем же размером файла) до следующих свойств, используйте параметр /IT
(Include Tweaked):
A
для параметра / COPY)S
для параметра /COPY
)O
для параметра /COPY
)U
для параметра /COPY
)Кажется, что Robocopy не предлагает опцию обнаружения одинаковости файлов на основе их содержимого (что обычно реализуется с помощью криптографической хеш-функции).
Следовательно, в редких случаях, когда могут существовать файлы с одинаковыми отметками времени последнего изменения и одинаковыми размерами файлов, которые, тем не менее, различаются по содержанию, вы можете использовать только параметр /IS
(Включить то же самое):
Это приводит к тому, что файлы, которые считаются одинаковыми, будут скопированы безоговорочно - и, следовательно, потенциально излишне.
Предостережение: Любопытно, что файлы, которые одинаковы по отношению к последней измененной метке файла и размеру файла, но отличаются по свойствам, упомянутым выше , не включаются по умолчанию только с /IS
; поэтому, чтобы покрыть все возможные варианты, используйте /IS
и /IT
вместе взятые.
Следующие тесты Пестера демонстрируют поведение; сохраните код как Tests.ps1
и вызовите его как Invoke-Pester ./Tests.ps1
:
Describe RoboCopySkippedFilesTests {
BeforeAll {
Push-Location TestDrive:
}
AfterAll {
Pop-Location
}
BeforeEach {
# Set up a source and a destination folder and make their
# Content the same.
if (Test-Path dest) { Remove-Item -Force -Recurse dest }
$null = New-Item -Type Directory -Force src
'file1' > src\file1
'file2' > src\file2
Copy-Item -Recurse src dest
}
It "Does not copy anything with identical folders." {
robocopy.exe src dest
$LASTEXITCODE | Should Be 0
}
It "Does recognize a changed last-modified filestamp" {
(gi src\file1).LastWriteTime = [datetime]::now
robocopy.exe src dest # | Out-Host
$LASTEXITCODE | Should Be 1
}
It "Does recognize a change in file size" {
'!' | Add-Content dest\file1
robocopy.exe src dest # | Out-Host
$LASTEXITCODE | Should Be 1
}
It "Does not recognize a change in file content, with size and last-modified date identical" {
'file!' > dest\file1
(Get-Item dest\file1).LastWriteTime = (Get-Item src\file1).LastWriteTime
robocopy.exe src dest # | Out-Host
$LASTEXITCODE | Should Be 0
}
It "Does not recognize a change in file attributes, with size and last-modified date identical" {
(Get-Item dest\file1).Attributes = 'System'
robocopy.exe src dest # | Out-Host
$LASTEXITCODE | Should Be 0
}
It "Does recognize an attribute-modified-only file as tweaked (/IT)" {
(Get-Item dest\file1).Attributes = 'System'
robocopy.exe src dest /IT # | Out-Host
$LASTEXITCODE | Should Be 1
}
It "Does not include an attribute-modified-only file with /IS" {
Remove-Item src\file2, dest\file2
(Get-Item dest\file1).Attributes = 'System'
robocopy.exe src dest /IS # | Out-Host
$LASTEXITCODE | Should Be 0
}
}
Вы должны увидеть что-то вроде следующего, указывающее, что все тесты пройдены (по состоянию на Robocopy.exe
с версией файла 10.0.16299.15 (WinBuild.160101.0800)
):
Describing RoboCopySkippedFilesTests
[+] Does not copy anything with identical folders. 231ms
[+] Does recognize a changed last-modified filestamp 112ms
[+] Does recognize a change in file size 68ms
[+] Does not recognize a change in file content, with size and last-modified date identical 69ms
[+] Does not recognize a change in file attributes, with size and last-modified date identical 83ms
[+] Does recognize an attribute-modified-only file as tweaked (/IT) 65ms
[+] Does not include an attribute-modified-only file with /IS 70ms
Tests completed in 589ms
Passed: 7 Failed: 0 Skipped: 0 Pending: 0 Inconclusive: 0
По умолчанию Robocopy пропускает копирование существующих файлов, если конкретные метаданные файлов совпадают, тогда эти файлы будут пропущены из операции копирования.
Как указано @ mklement0, подразумеваемое значение по умолчанию /COPY:DAT
не будет копировать файлы с другими данными, если отметка времени [LastWriteTime] и размер файла одинаковы, и, следовательно, это пропуск по умолчанию.
Поэтому, если по какой-то причине у вас есть синхронизируемые два файла, которые имеют соответствующий размер файла, имя файла и последние измененные атрибуты, даже если данные отличаются, он не будет копировать исходный файл.
Опции Robocopy по умолчанию:
/DCOPY:DA /COPY:DAT /R:3 /W:1
/COPY:copyflag[s] : What to COPY (default is /COPY:DAT)
(copyflags : D=Data, A=Attributes, T=Timestamps
S=Security=NTFS ACLs, O=Owner info, U=aUditing info).