Comandos do Robocopy: Migração de Dados, Sincronização de Pastas e Mais

Robocopy é uma das utilidades de linha de comando mais usadas para copiar grandes volumes de dados no Windows. É uma ferramenta tão popular devido à sua poderosa funcionalidade. No entanto, toda essa potência traz consigo complexidade. Neste guia, vamos desdobrar toda essa complexidade e fornecer um tutorial completo sobre como usar essa ferramenta útil.

Robocopy é uma utilidade de linha de comando do Windows que está disponível desde o Windows NT. É uma substituição para a menos versátil utilidade xcopy. Permite que você especifique um caminho de unidade ou caminho de servidor para copiar/mover arquivos no prompt de comando.

A versão do Robocopy até o momento desta escrita é a 10.0.18. Esta é a versão na qual realizei meus testes.

O Robocopy oferece uma série de recursos que você pode aproveitar para realizar cópias e movimentações eficientes e rápidas de arquivos. Ele pode:

  • Copiar arquivos pela rede com capacidade de retomada
  • Pode pular pontos de junção NTFS, evitando falhas geralmente causadas por loops infinitos
  • Pode copiar atributos de arquivo e diretório preservando carimbos de data/hora
  • Pode copiar permissões NTFS, proprietários e informações de auditoria
  • Pode copiar carimbos de data/hora de diretórios
  • Pode copiar arquivos no modo ‘backup’ para garantir que sejam copiados mesmo que os direitos tenham sido negados ao administrador
  • Tentativas automáticas de recuperação
  • Pode sincronizar duas pastas
  • É inteligente o suficiente para pular arquivos já copiados
  • Pode copiar caminhos maiores que o limite de 256 caracteres
  • Realizar cópias assíncronas usando sua capacidade de multithreading.
  • Retorna códigos de saída padronizados para uso em scripts.

Como você pode ver, há muito para copiar. Eu queria abranger tudo que você precisa saber sobre essa ferramenta útil.

Referência de Sintaxe Comum do Robocopy

Por que um post tão longo sobre uma única ferramenta? Apenas dê uma olhada nas tabelas abaixo. Você tem muitas opções para copiar ou mover arquivos com o robocopy! Você encontrará mais opções nas seções individuais.

Essas tabelas foram construídas a partir da sintaxe de ajuda retornada por robocopy /?. Elas foram divididas em seções mais significativas, adicionadas ao longo do tempo e limpas para fornecer informações mais úteis.

Opções de Origem

Switch Explanation Default Behavior Equivalent Switch Notes
/S Copy subfolders
/E Copy subfolders including empty subfolders
/COPY:[DATSOU] Copy options /COPY:DAT D=Data, A=Attributes, T=Timestamps S=Security=NTFS ACLs, O=Owner info, U=aUditing info. File Data (D) always includes file Timestamps (T)
/SEC Copy files with SECurity /COPY:DATS
/DCOPY:T Copy directory timestamps
/COPYALL Copy ALL file info /COPY:DATSOU This will prevent dehydrating offline files and will instead copy the file’s tag (on emc VNX/Unity systems at least). This is not officially documented! If dehydration is what you need (reason i found this issue), you can’t copy the ACLs along your files. CREDIT: Monsieurx (Reddit)
/NOCOPY Copy NO file info useful with /PURGE
/A Copy only files with the Archive attribute set
/M like /A, but remove Archive attribute from source files
/LEV:n Only copy the top n LEVels of the source tree
/MAXAGE:n MAXimum file AGE – exclude files older than n days/date
/MINAGE:n MINimum file AGE – exclude files newer than n days/date If n < 1900 then n = no of days, else n = YYYYMMDD date
/FFT Assume FAT File Times 2-second date/time granularity. This replaces NTFS timestamps. Seems to be more reliable when transferring over a network.
/256 Turn off very long path (> 256 characters) support

Opções de Destino

Switch Explanation Default Behavior Equivalent Switch Notes
/A+:[RASHCNET] Set file attribute(s) on destination files + add
/A-:[RASHCNET] Remove file attribute(s) on destination files
/FAT Create destination files using 8.3 FAT file names only
/CREATE Create directory tree structure + zero-length files only
/DST Compensate for one-hour DST time differences

Opções de Cópia

Switch Explanation Default Behavior Equivalent Switch Notes
/L List files only Don’t copy, timestamp or delete any files
/MOV Move files Delete from source after copying
/MOVE Move files and directories Delete from source after copying
/sl Copy file symbolic links instead of the target
/Z Copy files in restartable mode Survive a network glitch
/B Copy files in backup mode
/J Copy using unbuffered I/O Recommended for large files
/NOOFFLOAD Copy files without using the Windows copy offload mechanism https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831628(v=ws.11)
/EFSRAW Copy any encrypted files using EFS RAW mode
/TIMFIX Fix file times on all files, even skipped files
/XO Exclude older if destination file exists and is the same date or newer than the source – don’t bother to overwrite it.
/XC Exclude changed files
/XN Exclude newer files
/XX Exclude files present in destination but not source /XX
/XF file [file]… Exclude files matching given names/paths/wildcards
/XD dirs [dirs]… Exclude directories matching given names/paths. /XF and /XD can be used in combination e.g. ROBOCOPY c:\source d:\dest /XF *.doc *.xls /XD c:\unwanted /S
/IA:[RASHCNETO] Include files with any of the given attributes
/XA:[RASHCNETO] Exclude files with any of the given attributes
/IM Overwrite modified files. This includes the same files with different times.
/IS Overwrite files even if they are already the same
/IT Include tweaked files
/XJ Exclude junction points from source /XJ
/XJD Exclude junction points from source directories
/XJF Exclude junction points from source files
/MAX:n Exclude files bigger than n bytes
/MIN:n Exclude files smaller than n bytes
/MAXLAD:n Exclude files unused since n
/MINLAD:n Exclude files used since n If n < 1900 then n = n days, else n = YYYYMMDD date
/MIR Mirror a directory tree /PURGE /E
/PURGE Delete dest files/folders that no longer exist in source
/XL Exclude files present in source but not destination
/SECFIX Robocopy /secfix fixes file security on all files, even skipped files. Specify the type of security information you want to copy by also using one of these options: /COPYALL /COPY:O /COPY:S /COPY:U /SEC
/ZB Use restartable mode; if access denied use Backup mode

Opções de Monitoramento

Switch Explanation Default Behavior Equivalent Switch Notes
/R:n Number of retries on failed copies /R:1000000 Always try to set this option. I recommend setting this to 10-20 to not waste time retrying.
/W:n Wait time between retries /W:30 Always try to set this option to a lower number to retry more quickly. I suggest 5-10.
/REG Save /R:n and /W:n in the Windows registry as default settings
/RH:hhmm-hhmm times when new copies can be started
/TBD Wait for sharenames to be defined retry error 67
/PF Check run hours on a per file (not per pass) basis
/MON:n Run again when more than n changes seen
/MOT:m Run again in m minutes, if changed

Compreendendo o Comportamento do Robocopy

I’ve now completely blew your mind with all of the potential syntax options available to you. Let’s now see all of the different combinations of how we can use this syntax.

I could provide you an enormously long list of robocopy commands with an ever-growing number of switches. But I think it’s better to teach you how to fish. Let’s go over how to put sense out of all of these options.

O Robocopy Apenas Copia Diretórios Inteiros

Cada execução do robocopy terá um diretório de origem e um diretório de destino. O Robocopy copia e move arquivos por diretório inteiro. Não é possível explicitamente copiar um único arquivo com o robocopy. Use copy ou Copy-Item do PowerShell para isso.

No entanto, você pode usar o robocopy para copiar um único arquivo com o filtro correto, como você aprenderá abaixo. Para copiar um único arquivo com o robocopy, especifique os diretórios de origem e destino seguidos imediatamente pelo nome do arquivo na origem.

> robocopy c:\src d:\dst copythisfile.txt

A Sintaxe Depende do Ambiente

Além disso, as opções que você fornece ao robocopy dependerão do ambiente. Você precisará responder a algumas perguntas ao tentar descobrir quais opções usar.

  • Você sempre estará copiando para um diretório vazio?
  • É possível que arquivos já existam no diretório de destino?
  • Você estará copiando terabytes de dados ou apenas alguns megabytes?
  • Você estará copiando arquivos pela rede ou localmente?
  • …e mais.

Se não houver arquivos no diretório de destino, você não precisa se preocupar com opções que sobrescrevem arquivos. Se você não estiver copiando arquivos pela rede, não se preocupe com essas opções. Defina explicitamente as circunstâncias atuais e futuras potenciais em que seu ambiente estará.

Reconheça as Opções Padrão

O Robocopy usa muitas opções por padrão. Você pode identificá-las olhando para as tabelas acima. Ele também fornece uma saída útil toda vez que você executa a utilidade.

Você pode ver abaixo que quando executei o robocopy com suas opções mais básicas (a pasta de origem e de destino), ele usou automaticamente algumas opções. Entender o comportamento padrão é importante.

Referencie as opções que você vê na saída com as explicações de opções acima e você entenderá exatamente o que o robocopy está fazendo por baixo dos panos.

Default robocopy options

Entendendo o que os Comandos do Robocopy podem Fazer

Se você já usou os comandos copy ou Copy-Item do PowerShell, provavelmente especificou uma origem e um destino e seguiu em frente com seu dia. Não há muitas opções que você pode configurar lá. Esses comandos do robocopy têm um comportamento padrão.

Mas o robocopy, por outro lado, entende muito mais e oferece a flexibilidade para ajustar o comportamento tanto quanto desejar.

É importante saber que o robocopy não apenas entende o conceito de arquivo ou diretório. Há muito mais em um sistema de arquivos do que isso e o robocopy suporta praticamente tudo.

A file sitting on a filesystem isn’t just a dumb object with a single purpose. There are many different attributes and things that go with the concept of a file. For example, a file has attributes such as:

  • a timestamp (written, modified and accessed)
  • ACL NTFS
  • um proprietário
  • informações de auditoria NTFS
  • sinalizador oculto
  • sinalizador arquivado

Ao copiar ou mover um arquivo, você tem a opção de trazer todas essas informações junto, se desejar.

Entenda que, quando você executa o robocopy, você não está apenas copiando um arquivo, mas também potencialmente copiando todas as outras informações junto com ele. É importante perceber isso e levar isso em consideração nas opções que você fornece ao robocopy.

O básico: Realizando cenários de simulação

Se você possui um servidor de arquivos enorme em algum lugar que deseja migrar e não deseja tomar nenhuma ação ainda, você pode usar o robocopy para retornar o que ele teria feito.

Usando a opção /L, você pode dizer ao robocopy para enumerar todos os arquivos e/ou pastas que você especificar e retornar uma lista dos arquivos que ele teria copiado/movido.

Você pode usar a opção /L com qualquer outra opção. Esta é uma ótima maneira de retornar todas as opções que o robocopy teria usado (padrão ou não). Isso lhe dará uma visão geral do que o robocopy fará com as opções que você forneceu.

Using /L

O básico: Copiando arquivos

O uso mais básico do robocopy é usar um diretório de origem e um diretório de destino sem opções.

> robocopy C:\src C:\dst

Essa opção irá copiar todos os arquivos (excluindo subpastas) de C:\src para C:\dst.

Você também pode copiar tudo incluindo subpastas (vazias ou não) e permissões NTFS. Isso é, pelo que posso entender, o método para literalmente copiar tudo o que há em um diretório de arquivos para outro diretório.

Abaixo estou copiando todas as ACLs do NTFS, proprietários de arquivos, subpastas (incluindo as vazias) e todos os atributos de arquivo. Tudo isso é possível apenas com a opção /E para incluir todas as subpastas vazias e /COPYALL para pegar o restante.

> robocopy C:\src C:\dst /E /COPYALL

O básico: Movendo Arquivos

Mover arquivos transfere arquivos de um diretório para outro, assim como a cópia faz. A única diferença com uma operação de movimentação é que os arquivos de origem são removidos após a cópia.

Para excluir arquivos/diretórios da origem após a cópia, use a opção /MOV. Isso removerá todos os arquivos no diretório especificado (sem subpastas).

> robocopy C:\src C:\dst /MOV

Você também pode usar /MOVE para mover todos os arquivos e subpastas.

> robocopy C:\src C:\dst /MOVE

O básico: Sincronizando Arquivos

O Robocopy permite que você sincronize dois diretórios. Isso significa garantir que todos os arquivos no diretório de destino estejam no diretório de origem e nada mais. /MIR irá replicar a cópia de dados de todos os arquivos na origem que não estão no destino e excluir arquivos no destino que não estão na origem. Cuidado!

> robocopy C:\src C:\dst /MIR

Copiar Arquivos em uma Rede

Se você estiver copiando arquivos em uma rede, existem algumas opções que você deve considerar.

Robocopy permite que você copie arquivos em ‘modo reiniciável’ usando a opção /Z. Isso significa que se um arquivo começar a ser copiado e falhar no meio do caminho, a cópia pode recomeçar em vez de falhar completamente. A opção /Z é útil quando a conexão é interrompida em uma rede.

Aviso: Alguns relataram que o uso de /Z reduz o desempenho em 1/4. Compartilhe suas descobertas.

Você também pode usar a opção /FFT. Este interruptor é conhecido por preservar mais precisamente os carimbos de data e hora dos arquivos ao transferir pela rede. Esta opção utiliza os carimbos de tempo do sistema de arquivos FAT em vez do NTFS.

robocopy C:\src \\SRV1\share /Z /FFT

O uso de /IPG para Controlar o Intervalo Entre Pacotes

Ao copiar arquivos pela rede, você pode usar o interruptor /IPG. Isso também é conhecido como a opção de intervalo entre pacotes. Esta opção define (em milissegundos) a frequência com que o robocopy aguardará entre o envio de novos pacotes.

Sempre use Caminhos UNC, não Letras de Unidade

A reader on Reddit discovered the hard way to not use mapped drives as a destination directory. Instead, always use always use a UNC path. You might run into issues with the 256-character limit if you do. Check out this Microsoft doc for more information.

Modo de Backup do Robocopy (Robocopy /Z)

O Robocopy tem uma opção (/B) ou como um backup para o modo reiniciável (/ZB) que copia arquivos em modo de backup. O que é o “modo de backup” de qualquer maneira?

Quando você normalmente copia um arquivo no Windows e encontra um arquivo que requer privilégios administrativos para acessar, você receberá um erro indicando que não tem permissão. Mesmo que esteja sendo executado como administrador local, o Windows não permitirá o acesso.

ATENÇÃO: Houve relatos de volumes de servidor corrompidos ao copiar dados para um servidor Windows 2016 com a desduplicação ativada. Quando você utiliza a opção /ZB, o resultado é a destruição de um repositório de chunks de desduplicação na pasta System Volume Information. Os arquivos copiados não serão legíveis e gerarão erros ao tentar manipulá-los. Link do Serverfault com mais informações.

O modo de backup é uma maneira de acessar arquivos sem se preocupar com permissões.

O Robocopy utiliza o modo de backup para utilizar o SeBackupPrivilege para leitura de arquivos e o direito do usuário SeRestorePrivilege para acessar quaisquer arquivos necessários. Isso ignora quaisquer ACEs que normalmente impediriam o acesso a esses arquivos.

Os direitos do usuário SeBackupPrivilege e SeRestorePrivilege são normalmente atribuídos aos usuários nos grupos Backup Operators e Administradores, mas às vezes podem ser removidos. O módulo de backup elimina esse risco e concede temporariamente ao usuário que executa o robocopy esses direitos.

Se você quiser verificar se sua conta de usuário possui esse direito, pode executar whoami /priv e ambos os direitos devem ser exibidos.

Filtragem de Arquivos e Pastas

A grande maioria das opções disponíveis para você é para excluir arquivos e diretórios de muitas maneiras diferentes. Eu dividi todas as formas de filtrar ou excluir arquivos e diretórios com base em vários critérios.

Pelo Nome do Arquivo ou Extensão do Arquivo

Filtrar quais arquivos são copiados/movidos em uma chamada de robocopy é feito usando curingas. Você pode usar um curinga para filtrar arquivos que correspondam a um determinado nome de arquivo ou extensão.

Por exemplo, para copiar apenas arquivos TXT, você pode especificar *.txt.

> robocopy C:\src C:\dst *.txt

Se você deseja limitar apenas aos arquivos que começam com a letra a, você pode usar a*.

> robocopy C:\src C:\dst a*

Você também pode fornecer múltiplos conjuntos de correspondências de nomes de arquivo separando-os com um espaço, como mostrado abaixo.

> robocopy C:\src C:\dst a* b*

Ao filtrar pelo nome do arquivo, o robocopy mostrará o filtro na saída.

FIltering files output

Pelo Nome do Diretório

O Robocopy permite que você filtre itens não apenas pelo arquivo, mas também pelo nome do diretório. Usando robocopy /xd, você pode excluir determinados diretórios que correspondam a um nome específico.

Ao copiar vários diretórios, use o comando /XD para excluir diretórios da execução.

> robocopy C:\src C:\dst /XD "c:\src\exclude"

Pelo Carimbo de Data/Hora do Arquivo/Diretório

Abaixo, você encontrará todas as opções do robocopy que excluirão arquivos e pastas com base em vários atributos de carimbo de data/hora.

Switch Explanation
/DCOPY:T Copy directory timestamps
/MAXAGE:n Exclude files older than n days/date
/MINAGE:n Exclude files newer than n days/date
/XO If destination file exists and is the same date or newer than the source, don’t overwrite
/XN If destination file exists and is the same date or older than the source, don’t overwrite

Há duas opções populares para escolher ao filtrar coisas como carimbo de data/hora; /XO e /MAXAGE.

/XO permite que você exclua arquivos da cópia apenas se eles forem mais recentes do que a origem. Usando a opção /XO, você pode robocopy apenas arquivos novos por data de acesso.

> robocopy C:\src C:\dsc /XO

Se você souber a idade máxima que os arquivos terão, você também pode usar a opção /MAXAGE. Isso permite que você especifique no formato AAAAMMDD a data mais antiga que um arquivo pode ter antes de ser copiado.

> robocopy c:\src c:\dst /S /MAXAGE:20191001

Trabalhos do Robocopy

Você viu que dezenas de opções estão disponíveis para você. É fácil que essas opções logo se tornem difíceis de gerenciar. Felizmente, você tem uma opção melhor do que memorizar e garantir que todas essas opções estejam corretas toda vez.

Arquivos de trabalho do Robocopy são arquivos de texto contendo uma opção por linha. Normalmente, você usará o robocopy para criar esses arquivos de trabalho. Uma vez criados, você pode usar o robocopy para modificá-los ou um editor de texto simples.

Você tem vários comandos robocopy que funcionam com os trabalhos.

Switch Explanation Default Behavior Equivalent Switch Notes
/JOB:jobname Take parameters from the named job file
/SAVE:jobname Save parameters to the named job file
/QUIT Quit after processing command line Useful for viewing parameters
/NOSD No source directory is specified
/NODD No destination directory is specified
/IF Include the following files

A typical job file created with robocopy has an RCJ extension and looks like the below snippet. This job file was created by running robocopy C:\src D:\dst /save:myjob. You can see that you can provide comments in the job file using :: which is most of what this file has.

Sem comentários, o arquivo conteria apenas uma opção por linha.

::
:: Robocopy Job C:\MYJOB.RCJ
::
:: Created by Administrator on Sunday, August 18, XXXX at 8:53:24 AM
::

::
:: Source Directory :
::
        /SD:C:\SRC\     :: Source Directory.

::
:: Destination Directory :
::
        /DD:C:\SRC\     :: Destination Directory.

::
:: Include These Files :
::
        /IF             :: Include Files matching these names
::              *.*     :: Include all names (currently - Command Line may override)

::
:: Exclude These Directories :
::
        /XD             :: eXclude Directories matching these names
::                      :: eXclude no names (currently - Command Line may override)

::
:: Exclude These Files :
::
        /XF             :: eXclude Files matching these names
::                      :: eXclude no names (currently - Command Line may override)
::
:: Copy options :
::
        /DCOPY:DA       :: what to COPY for directories (default is /DCOPY:DA).
        /COPY:DAT       :: what to COPY for files (default is /COPY:DAT).
::
:: Retry Options :
::
        /R:1000000      :: number of Retries on failed copies: default 1 million.
        /W:30           :: Wait time between retries: default is 30 seconds.
::
:: Logging Options :
::

Salvando Arquivos de Trabalho

Salvar um arquivo de trabalho é tão simples quanto adicionar a opção /SAVE:<nomedojob> ao final da sua sintaxe. Substitua <nomedojob> pelo nome do trabalho. A opção /SAVE criará um arquivo chamado <nomedojob>.rcj no diretório onde você executou o robocopy.

> robocopy C:\src C:\dst /SAVE:myjob

Você deve especificar /SAVE como a última opção. Quaisquer opções especificadas após /SAVE não serão adicionadas ao arquivo de trabalho. Além disso, observe que mesmo que um arquivo de trabalho existente já esteja lá, o robocopy sempre sobrescreverá o existente. Faça backup ou controle de versão de seus arquivos de trabalho!

Nota: Se você tentar usar a opção /MT ao salvar em um arquivo de trabalho, ela não será incluída no arquivo de trabalho. Me avise se você conseguir incluir isso.

Usando Arquivos de Trabalho

Uma vez que um trabalho é salvo em um arquivo de trabalho, você pode usar a opção /JOB:<nomedotrabalho> para especificar o arquivo de trabalho a ser lido. O Robocopy lê todos os parâmetros dentro do arquivo de trabalho e então executa como se você tivesse fornecido as opções diretamente na linha de comando.

> robocopy /JOB:myjob

Criando um Arquivo de Trabalho Sem Executar um Trabalho Usando /QUIT

O propósito da opção /QUIT não é óbvio. À primeira vista, você pode pensar que /QUIT força a saída de um trabalho em execução. Em vez disso, /QUIT age mais como uma opção para impedir que um trabalho seja executado em primeiro lugar.

Oficialmente, a opção /QUIT “força o robocopy a encerrar o processamento da linha de comando”. No entanto, seria melhor explicado como criar um arquivo de trabalho sem executar um trabalho.

Se você usar a opção /SAVE, ela também executará automaticamente o trabalho. Não há como criar um arquivo de trabalho sem executar o trabalho primeiro. Você pode criar o arquivo de trabalho RCJ com um editor de texto ou pode usar o robocopy para fazer isso, adicionando /QUIT ao final.

> robocopy C:\src C:\dst /SAVE:myjob /QUIT

Editando um Arquivo de Trabalho

Como os arquivos de trabalho são apenas arquivos de texto, você pode editá-los com seu editor de texto favorito ou pode pedir para o robocopy fazer isso por você.

Você pode editar arquivos de trabalho usando uma combinação de /JOB, /SAVE e /QUIT.

Por exemplo, talvez você queira excluir todos os arquivos EXE do seu trabalho robocopy salvo em um arquivo de trabalho chamado backupfiles.rcj. Você já criou o arquivo de trabalho e não quer sobrescrever o arquivo inteiro. Você pode adicionar a nova opção assim:

> robocopy /JOB:backupfiles /XF *.EXE /SAVE:backupfiles /QUIT

Usando Múltiplos Arquivos de Tarefa

É possível combinar o uso de vários arquivos de tarefa também. Ao especificar vários arquivos de tarefa na mesma execução, todas as opções usadas nessa execução serão combinadas.

Por exemplo, talvez você tenha uma grande lista de arquivos para excluir do seu trabalho de cópia de backupfiles. Abra um editor de texto e adicione o seguinte para criar um arquivo exclude.rcj.

/XF
    a.exe
    b.txt
    c.cer

Você pode então excluir esses arquivos do trabalho backupfiles assim:

> robocopy /JOB:backupfiles /JOB:exclude

Como o arquivo original de trabalho backupfiles já estava excluindo todos os arquivos EXE, a sintaxe da execução acima seria /XF *.exe a.exe b.txt c.cer. O Robocopy combina todas as opções em uma única.

Modelos do Robocopy e o Uso das Opções /NOSD e /NODD

Se você estiver trabalhando com muitos arquivos de tarefa, pode criar arquivos de tarefa para aceitar parâmetros. O Robocopy permite que você passe valores da linha de comando para os trabalhos quando eles são executados. Um parâmetro não é um termo do Robocopy, mas se encaixa bem nesse cenário.

Você pode criar trabalhos do Robocopy para aceitar parâmetros não especificando um diretório de origem ou destino explicitamente, usando as opções /NOSD e /NODD, ou simplesmente não incluindo um diretório de origem e destino de forma alguma.

Como exemplo simples, crie um arquivo de tarefa sem um diretório de origem ou destino usando a sintaxe abaixo. A intenção deste trabalho é copiar todos os arquivos TXT e EXE de uma origem para um diretório de destino.

> robocopy *.txt *.exe /SAVE:backupfiles /QUIT

Por si só, este trabalho nunca funcionará porque não há um diretório de origem ou destino especificado.

Quando você cria um trabalho sem especificar um diretório de origem e destino, o arquivo de trabalho é automaticamente criado usando as opções /NOSD e /NODD.

/NOSD           
/NODD
/IF
    *.txt
    *.exe
/DCOPY:DA
/COPY:DAT
/R:1000000
/W:30

A opção /NOSD informa ao robocopy que você não incluiu um diretório de origem, enquanto /NODD indica que você não incluiu um diretório de destino. Este arquivo de trabalho serve como um “modelo” para outros trabalhos.

No entanto, você pode passar “parâmetros” para este arquivo de trabalho para fornecer os diretórios de origem e destino.

Para usar o arquivo de trabalho recém-criado para copiar arquivos de C:\src para C:\dst, você pode passar esses diretórios diretamente na linha de comando, que serão então repassados para o trabalho.

> robocopy /JOB:backupfiles C:\src C:\dst

Cópia Assíncrona (Robocopy /MT)

Por padrão, o robocopy processa apenas um arquivo por vez. No entanto, você pode forçar o robocopy a copiar mais arquivos de uma vez usando a opção /MT.

A opção /MT permite que você especifique o número de threads que o robocopy usará para copiar arquivos. O máximo é 128.

Você pode usar /MT assim:

> robocopy C:\src C:\dst /MT:32

I’ve chosen 32 in this case as a baseline. I suggest starting at 32 to see how your computer and network handle things and adjust the threads accordingly.

Observe que se você usar /MT, não será possível usar /IPG ou /EFSRAW. Para melhor desempenho, não envie o log para o console. Em vez disso, use /LOG.

Agendamento do Robocopy

O Robocopy oferece algumas maneiras de agendar quando ele é executado.

Usando /RH

Usando a opção /RH, você pode dizer ao robocopy para rodar apenas durante um horário específico. Isso é ótimo se você tiver uma janela de manutenção ou um momento em que todos já foram para casa no final do dia.

Você pode especificar um horário de início e um horário de término no formato HHMM-HHMM. Por exemplo, para invocar o robocopy, mas permitir que ele execute apenas entre as 17h e as 9h, conforme definido pelo relógio do sistema, execute:

> robocopy C:\src C:\dst /RH:1700-0900

Você verá que se invocar o robocopy fora dessas horas, ele informará o horário atual e esperará pelo horário de início para executar.

Robocopy tells you what time it will start if scheduled

Você deve garantir que ambos os horários estejam em formato de 24 horas e tenham exatamente quatro dígitos. A janela deve ser maior que dois minutos.

Por padrão, usando /RH irá verificar o horário de início antes de toda a execução. No entanto, se você tiver muitos arquivos e acreditar que o processo pode levar mais tempo que isso, você pode usar a opção /PF. /PF forçará o robocopy a verificar a janela antes de cada arquivo.

Usando o Agendador de Tarefas

O Log de Saída

O robocopy sempre retornará um log de saída. Se esse log é exibido via stdout no console e/ou redirecionado para um arquivo de log, depende de você.

Você tem muitas opções ao exibir a saída do robocopy.

Switch Explanation Default Behavior Equivalent Switch Notes
/NP No progress. Suppresses the display of progress information. This can be useful when output is redirected to a file.
/unicode Display the status output as unicode text
/LOG:file Output status to log file and overwrite
/UNILOG:file Output status to unicode log file and overwrite
/LOG+:file Output status to log file and append to existing log file
/UNILOG+:file Output status to unicode log file and append to existing log file
/TS Displays the file timestamps for every file processed.
/FP Replaces simple file names with full file pathnames in the output.
/NS Does not show file sizes.
/NC Hides output the file class “Text Tags” (Go here for more information: https://www.uvm.edu/~gcd/2015/04/robocopy-file-classes/)
/NFL Hides file names. Failures are still logged though. Any files files deleted or would be deleted if /L was omitted are always logged
/NDL Hides output of the directory listing. Full file pathnames are output to more easily track down problematic files.
/TEE Output to console window, as well as the log file
/NJH No job header
/NJS No job summary
/BYTES Print sizes as bytes
/X Report all files, not just those selected & copied
/V Produce verbose output log, showing skipped files
/ETA Show estimated time of arrival of copied files. See the start time of each file copy and the estimated time of completion based on the observed throughput of previous copies. Times are displayed after the file name in the format HH:MM – > HH:MM (start – > finish).
/DEBUG Show debug volume information

Limitando Elementos de Log com /NJS e /NJH

Por padrão, o robocopy retorna dois elementos em sua saída, um cabeçalho de trabalho e um resumo do trabalho.

O cabeçalho do trabalho é o simples cabeçalho ROBOCOPY no topo.

Robocopy job header

O resumo do trabalho mostra um status resumido de todos os arquivos/pastas, quanto dados foram transferidos e o horário em que a execução foi concluída.

Robocopy job summary

Você pode ocultar cada um desses elementos usando a opção /NJH para ocultar o cabeçalho do trabalho e a opção /NJS para ocultar o resumo do trabalho. Você pode incluir qualquer uma dessas opções ou ambas juntas.

Hiding the job header and job summary

Redirecionando o Log de Saída para um Arquivo

Se você precisar salvar o log de saída, pode redirecioná-lo para um arquivo de texto e/ou exibi-lo no console. Você pode fazer isso usando redirecionadores de saída tradicionais como >, >>, PowerShell ou a opção /LOG.

Para redirecionar o log de saída para um arquivo usando a opção /LOG sobrescrevendo qualquer arquivo de log existente, use a sintaxe /LOG:<caminho_do_arquivo> como abaixo. A única saída que você receberá no console é o caminho para o arquivo de log.

> robocopy C:\src C:\dst /LOG:c:\file.log

 Log File : c:\file.log

Se você deseja manter o conteúdo de qualquer arquivo de log existente e anexar resultados a um arquivo, pode usar o operador + como mostrado abaixo.

> robocopy C:\src C:\dst /LOG+:c:\file.log

 Log File : c:\file.log

Redirecionando o Log de Saída para um Arquivo e Exibindo no Console

Se deseja salvar o log de saída em um arquivo e também vê-lo no console, pode usar a opção /TEE. Esta opção faz com que o robocopy escreva a saída no arquivo de log, mantendo ainda o comportamento padrão de retornar a saída para o console.

robocopy C:\src C:\dst /LOG+:c:\file.log /TEE

Códigos de Saída

Como todos os outros utilitários de linha de comando, o robocopy retorna códigos de saída dependendo dos resultados da execução. Todos desejamos que o robocopy sempre saia com sucesso com um 0, mas isso nem sempre acontece.

Abaixo você encontrará todos os códigos de saída que o robocopy retorna e suas explicações. Qualquer código de saída maior que sete indica pelo menos uma falha durante a execução.

Exit Code Explanation
0 No action performed. Source and destination are synchronized.
1 At least one file was copied successfully.
2 Extra files or directories were detected. Examine log.
3 Exit codes 2 and 1 combined.
4 Mismatched files or directories found. Examine log.
5 Exit codes 4 and 1 combined.
6 Exit codes 4 and 2 combined.
7 Exit codes 4, 1 and 2 combined.
8 At least one file or directory could not be copied. Retry limit exceeeded. Examine log.
16 Copy failed catastrophically.

Observe que se você estiver executando o robocopy em uma utilidade de terceiros, essa utilidade pode considerar qualquer código de saída diferente de zero como uma falha. Para evitar isso, você pode alterar o código de saída para 0 se ele retornar 1.

O código de saída de arquivo “extra” do Robocopy é um código de retorno comum que significa que há um arquivo “extra” na pasta de destino, mas não na pasta de origem. Este código exclui extras que impedirão quaisquer exclusões do destino.

Alterando o Código de Saída em um Arquivo de Lote

Se você estiver executando o robocopy com um arquivo em lote, você pode encontrar o valor da variável %ERRORLEVEL%. Se retornar 1, use a palavra-chave exit para sair do script com 0.

> (robocopy <options>) ^& IF %ERRORLEVEL% LEQ 1 exit 0

Alterando o Código de Saída em um script do PowerShell

Se você estiver executando o robocopy em um script do PowerShell, você pode invocar o robocopy com Start-Process usando PassThru para retornar o processo criado e Wait para esperar o término do robocopy. Em seguida, você pode verificar a propriedade ExitCode para um valor de 1. Se o código de saída for 1, saia do script do PowerShell com 0 usando $host.SetShouldExit().

$exitCode = (Start-Process -FilePath 'robocopy' -ArgumentList '<option>' -PassThru -Wait).ExitCode
if ($exitCode -eq 1) {
    $host.SetShouldExit(0)
}

Erros Comuns

Se você estiver lidando com milhares de arquivos, é provável que você encontre alguns problemas. Aqui está uma análise dos erros comuns que encontrei

Erro de Parâmetro Inválido

Quando você vê um erro indicando parâmetro inválido de erro, isso normalmente significa que você tentou passar opções para o robocopy de alguma forma fora de ordem. O erro parâmetro inválido de robocopy 3 é o mais comum, parece.

A common reason you’d receive this error is when you specify a source or destination directory with spaces and forget to surround it with quotes.

Exemplos do Robocopy

Você pode criar suas próprias strings de robocopy ou pode pegar o que os outros aprenderam e usá-los! Nesta seção, vou cobrir casos de uso sobre como usar o robocopy para realizar várias coisas.

Encontrar o tamanho do diretório de uma pasta de rede

Contribuidor: northendtroooper (Reddit)

> robocopy "\\MACHINE\fileshare" c:\dummy /l /xj /e /nfl /ndl /njh /r:0 /mt:64

Excluir rapidamente o conteúdo da pasta (ignorando permissões em subpastas)

Contribuidor: pizzasteveo (Reddit)

> robocopy c:\dummy c:\foldertodelete /MIR

Realizar migrações de arquivos grandes

Contribuidor: @MySnozzberries (Twitter)

O objetivo deste trecho é forçar a propriedade de todos os arquivos de volta para Administradores. Em seguida, adicionamos um ACE explícito para o grupo Administradores para controle total sobre cada objeto recursivamente, mesmo que também estejamos configurando herança.

Finalmente, fazemos uma cópia completa do robocopy com DACLs para o destino com log. O log pode então ser revisado para problemas de permissão adicionais ou apenas travamentos de arquivos e outra sincronização delta pode ser realizada posteriormente.

> takeown /F .\test /R /A /D Y
> icacls .\test /grant "Administrators":(OI)(CI)F /T
> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

Recursivamente force o grupo Administradores como proprietário de todos os arquivos e diretórios. Pode haver maneiras de contornar isso, mas esta é a abordagem mais agressiva e geralmente a mais rápida.

> takeown /F .\test /R /A /D Y

Uma vez que somos os proprietários, agora podemos forçar um novo ACE no DACL para cada objeto. Isso concede aos Administradores controle total com herança ativada e de forma recursiva pelo caminho.

Configurar isso na raiz com herança cobriria o ambiente, mas quando um compartilhamento tem CREATOR OWNER com Controle Total (o que infelizmente é até a recomendação da Microsoft para coisas como armazenamentos de perfil de usuário de arquivo), o usuário pode desativar a herança ou remover ACEs a seu critério. Portanto, uma abordagem agressiva geralmente é a solução mais rápida.

> icacls .\test /grant "Administrators":(OI)(CI)F /T

Uma vez que alteramos os DACLs na maioria dos arquivos, tentamos copiar os arquivos para um novo local, comum para coisas como migrações de compartilhamento de arquivos. Para isso, estamos copiando os itens de forma recursiva e usando o interruptor /SEC para também copiar os Dados/Atributos/Timestamps/DACLs.

Em seguida, registramos a operação com caminhos completos e para todos os objetos (interruptor /V verboso) em um registro, para que possamos remediar os <5% de erros que geralmente são relacionados ao comprimento do caminho ou bloqueio de arquivo e obter mais detalhes.

> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

Este é um framework simples para gerenciar uma migração de compartilhamento de arquivos com impacto mínimo na experiência do usuário. Ele também melhora o controle de TI sobre os dados. Se um cliente tiver uma prática forte de governança de dados onde a propriedade é gerenciada adequadamente em nível de pasta filho, isso se torna uma discussão mais complicada, mas a maioria dos clientes que encontramos tem a sorte de estar usando apenas herança e ACEs baseados em grupo, então esta é a situação mais comum e a correção com a qual começamos.

Alternativas ao Robocopy

O Robocopy é uma ferramenta incrível, mas existem muitas outras ferramentas semelhantes que podem ser de interesse.

  • xxcopy – Uma utilidade de linha de comando similar com toneladas de opções.
  • Comando Copy-Item do PowerShell – Não tão completo, mas muito mais simples.
  • TreeSize – Utilitário GUI e scriptável para encontrar informações de pastas.

Resumo

O Robocopy é uma excelente ferramenta para copiar grandes conjuntos de arquivos. Seja para fazer uma migração de dados, manter pastas sincronizadas ou simplesmente precisar de uma maneira rápida para copiar arquivos com precisão, o robocopy é uma ótima escolha.

Source:
https://adamtheautomator.com/robocopy/