-
Infelizmente, a documentação oficial não descreva a lógica por trás do quais arquivos são ignorados por padrão .
-
A documentação não oficial ss64.com , no entanto, fornece o ponteiro crucial (ênfase adicionada):
By default Robocopy will only copy a file if the source and destination have different time stamps or different file sizes.
Observação: registro de data e hora refere-se ao registro de data e hora da última modificação (somente).
Em outras palavras: Robocopy considera dois arquivos como sendo o mesmo baseado apenas sobre se seus timestamps e tamanhos de arquivo da última modificação são idênticos e, portanto, < em> ignora a cópia nesse evento.
Pelo que posso dizer:
-
Esse comportamento não é afetado pela modificação dos aspectos de um arquivo / diretório para copiar (parâmetros /COPY
/ DCOPY
)
- Esses argumentos só são aplicados se o RoboCopy tiver considerado fundamentalmente um determinado arquivo / diretório que precisa ser copiado, com base na lógica de igualdade / inclusão.
-
Se você quiser estender a detecção de amostragem padrão (mesmo registro de data e hora da última modificação e mesmo tamanho de arquivo) para as propriedades a seguir , use a opção /IT
( Incluir Tweaked ) :
- atributos de arquivo (representados como
A
para o parâmetro / COPY)
- ACL (representado como
S
para o parâmetro /COPY
)
- propriedade de arquivo (representada como
O
para o parâmetro /COPY
)
- informações de auditoria (representadas como
U
para o parâmetro /COPY
)
-
Robocopy parece oferecer não opção para detectar a mesmice dos arquivos com base em seu conteúdo (que é tipicamente implementado via a função hash criptográfica ).
Portanto, no evento raro , pode haver arquivos com registros de data e hora idênticos da última modificação e tamanhos de arquivo idênticos que, no entanto, diferem no conteúdo . A única opção é usar a opção /IS
( Incluir o mesmo ) :
-
Isso faz com que os arquivos considerados iguais sejam copiados incondicionalmente - e, portanto, potencialmente desnecessários.
-
Advertência : Curiosamente, os arquivos que são os mesmos em relação ao carimbo de arquivo e tamanho de arquivo da última modificação são diferentes em relação às propriedades mencionadas acima são não incluído por padrão com /IS
sozinho; portanto, para cobrir todas as eventualidades, use /IS
e /IT
combinados .
Os seguintes testes Pester demonstram
os comportamentos; salve o código como Tests.ps1
e invoque-o como 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
}
}
Você deve ver algo como o seguinte, indicando que todos os testes foram aprovados (a partir de Robocopy.exe
com a versão do arquivo 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