5

Я где-то читал, что Robocopy по умолчанию пропускает копирование существующих файлов.

Но... Я не могу найти переключатели командной строки для этого.

3 ответа3

3
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.
1
  • К сожалению, официальная документация не описывает логику того, какие файлы пропускаются по умолчанию.

  • Неофициальная документация ss64.com, тем не менее, содержит ключевой указатель (выделение добавлено):

    • По умолчанию Robocopy будет копировать файл только в том случае, если источник и место назначения имеют разные метки времени или разные размеры файлов.

Примечание: отметка времени относится к отметке времени последнего изменения (только).

Другими словами: Robocopy рассматривает два файла как одинаковые, основываясь только на том, идентичны ли их последние измененные метки времени и размеры файлов, и поэтому в этом случае копирование пропускается .

Из того, что я могу сказать:

  • На это поведение не влияет изменение аспектов файла / каталога для копирования (параметры /COPY / DCOPY)

    • Эти аргументы применяются только в том случае, если RoboCopy по существу счел данный файл / каталог нуждающимся в копировании, основываясь на логике одинаковости / включения.
  • Если вы хотите расширить обнаружение одинаковости по умолчанию (с той же самой отметкой времени последнего изменения и с тем же размером файла) до следующих свойств, используйте параметр /IT (Include Tweaked):

    • атрибуты файла (представленные как A для параметра / COPY)
    • ACL (представлен как 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
1

По умолчанию Robocopy пропускает копирование существующих файлов, если конкретные метаданные файлов совпадают, тогда эти файлы будут пропущены из операции копирования.

Как указано @ mklement0, подразумеваемое значение по умолчанию /COPY:DAT не будет копировать файлы с другими данными, если отметка времени [LastWriteTime] и размер файла одинаковы, и, следовательно, это пропуск по умолчанию.

Поэтому, если по какой-то причине у вас есть синхронизируемые два файла, которые имеют соответствующий размер файла, имя файла и последние измененные атрибуты, даже если данные отличаются, он не будет копировать исходный файл.

Опции Robocopy по умолчанию: /DCOPY:DA /COPY:DAT /R:3 /W:1


Robocopy или Robocopy /?

 /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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .