Robocopy não copia a pasta raiz e seu carimbo de data / hora


10

O Robocopy não copia a pasta raiz e seu carimbo de data / hora - ele copia todos os subdiretórios e arquivos (quando as opções apropriadas são definidas) e parece não haver opção / argumento para informar ao Robocopy que você deseja a própria pasta raiz e seu carimbo de data / hora para ser copiado textualmente também.

Digamos que eu quero copiar C: / Brushes

O Robocopy copiará todos os seus subdiretórios e arquivos para o destino, mas não a pasta Brushes em si, com todos os atributos associados e carimbo de data / hora.

Você entende o que estou perguntando? Isso é bastante básico e o Robocopy parece não ter uma opção para isso. As pessoas já fizeram a pergunta em vários fóruns, mas, no que me diz respeito, ninguém respondeu à pergunta.

insira a descrição da imagem aqui


1
Este é um folheto, com base na minha experiência com rsync, mas e se você não tiver uma barra no final da pasta de destino? Que tal tentar modificar o script no nível da linha de comando em vez de usar a GUI? Sei que a ferramenta de linha de comando fará o que você precisa.

@ Randolph West: atualmente não tenho uma barra no final da pasta de destino. Ainda não consigo fazer com que o Robocopy inclua a pasta de origem e seus atributos etc. no trabalho de cópia real. Alguma ideia?
Ptrcao

Se não houver solução para robocopy, você pode dar uma olhada no xxcopy (existem versões freeware e comerciais).
harrymc 29/01

Sim, eu entendo completamente e adicionei uma solução funcional abaixo. O verdadeiro problema é que você precisa especificar todos os arquivos e pastas na raiz para NÃO copiar.
opsin 31/01

Respostas:


9
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30 

Solte uma pasta batou use em Enviar para . Ele criará uma pasta com o nome e o horário do diretório de origem e copiará todos os arquivos.


muito obrigado, estava à procura de que a magia% operador ~ n1
hotzen

@hotzen, o que faz %~n1?
Pacerier 25/04


"Expande% 1 para um nome de arquivo."
hotzen

Microsoft quebrou todos os seus links, aqui tem o cento til documentação para lote, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf

3

Eu concordo com o OP, não poder copiar a pasta raiz é uma grande falha de robocopy. Que tal enganar e mover a pasta pincéis para uma pasta temporária, executando a operação de robocópia na pasta temporária e depois movendo-a de volta?

Algo como:

md "c:\verytemporary" && move "c:\brushes" "C:\verytemporary"||( echo Line 1 error occurred & goto :eof )
robocopy c:\verytemporary d:\ /MIR /DCOPY:T
move "c:\verytemporary\brushes" "c:\" && rd /q "c:\verytemporary"||echo Line 3 error occurred

2

Tente md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesna linha de comando, substituindo os caminhos corretos.


3
Sim, mas você está criando uma nova pasta que não terá os atributos da pasta C: \ brushes original ...?
Ptrcao

2

Como não vejo solução boa e fácil em nenhuma das respostas:

Se não houver solução para robocopy, você pode dar uma olhada no xxcopy (existem versões freeware e comerciais).

Obviamente, existem muitas outras alternativas ao robocopy, algumas estão listadas aqui .
Veja também Melhor Utilitário de Cópia de Arquivo Gratuito .


1
xxcopyé um ótimo utilitário, mas a versão do freeware possui um prompt ao qual você deve responder se estiver usando uma lista grande de opções de linha de comando. Usando xxcopyem uma janela de comando, esse prompt extra é irritante. Mas evita (complica) o uso de xxcopyum arquivo em lotes.
precisa saber é o seguinte

1

A resposta do usuário105198 é a meio caminho,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes de fato, apenas criará uma nova pasta. Você precisará anexar / MIR e / DCOPY: T a ele

Com a opção / mir , se o diretório de destino existir, as configurações de segurança do diretório de destino serão substituídas. Technet

/DCOPY:T :: COPY Directory Timestamps.

combinados, significa: os atributos e os registros de data e hora do diretório de origem serão espelhados na pasta criada.

então:

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes /MIR /DCOPY:T

1

Acho que você descobrirá que o Robocopy faz exatamente o que você deseja, desde que seja solicitado a copiar os carimbos de data / hora da pasta (/ DCOPY: T). Nas minhas experiências, descobri o seguinte comportamento (aparentemente não documentado) verdadeiro para o Robocopy:

Todas as propriedades especificadas do diretório de origem são aplicadas ao diretório de destino, independentemente de o diretório de destino existir, não existir ou ter um nome diferente do diretório de origem.

As propriedades especificadas podem incluir (pelo menos) as informações de segurança (/ SEC) ou os carimbos de data / hora da pasta (/ DCOPY: T).

Portanto, no exemplo a seguir, a pasta c: \ destination \ receberá os mesmos carimbos de data e hora que a pasta c: \ source \.

robocopy c:\source\folder C:\destination\folder /E /DCOPY:T

Testei isso com as versões do Robocopy incluídas no Windows 7, Windows 8 e no Windows 2003 Resource Kit (somente parâmetro / SEC). Observe que apenas as versões mais recentes do Robocopy (XP026 e superior) suportam o parâmetro / DCOPY: T.


0

Se você combinar /IF :: Include the following Files.com /E :: copy subdirectories, including Empty ones.você, obtém (próximo a) o efeito desejado:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"

1
Como assim "próximo"? Qual é a limitação que você está implicando?
Ptrcao

O perigo Robinson !!! Sua sugestão parece copiar todas as pastas na pasta atual, e não limitá-lo para as pastas começando com "pincéis"
GlennFromIowa

0

Robocopy não é realmente projetado para fazer isso facilmente. No entanto, existe um caminho.

A pasta raiz contém digamos 50 arquivos e 40 pastas. Você deseja apenas a pasta X (mas também deseja que seja a hora e a data).

ROBOCOPY c:\ d:\ /XF 50 root file names c:\boot.ini c:\bla.txt etc. /XD c:\windows c:\drivers c:\temp etc. /S /E /SEC /DCOPY:T

O / DCOPY: T diz para manter os carimbos de data / hora da pasta. O / XF especifica quais arquivos NÃO copiar, / XD especifica quais pastas NÃO copiar. Apenas não especifique a pasta c: \ X.

A principal desvantagem disso é pesquisar todas as pastas e nomes de arquivos na raiz e chamá-los todos especificamente aqui. Se você estiver fazendo isso muito em sistemas diferentes, um script poderá ser escrito.

Exemplo de trabalho

robocopy c: \ testing c: \ abc / XF c: \ testing \ Testing.txt / XD "C: \ testing \ Nova pasta (2)" "C: \ testing \ Nova pasta (3)" / S / E / SEC / DCOPIA: T

Exemplo de trabalho raiz

robocopy c: \ d: \ / XF c: \ Testing.txt / XD "C: \ Nova pasta (2)" "C: \ Nova pasta (3)" / S / E / SEC / DCOPY: T

Meu teste funcionou, eu crio algumas pastas e subpastas, c: \ testing era raiz neste caso, c: \ abc era raiz de outra unidade (obviamente elas não são realmente, mas para esse propósito, deveria fazer sentido). A pasta que eu queria da raiz chamava-se "Nova Pasta", como você pode ver, eu não a especifiquei no / XD. Além disso, certifique-se de especificar c: \ ou os nomes que você usar serão globais. Em outras palavras, se eu não especificasse c: \ testing no arquivo Testing.txt, ele o omitiria de TODAS as subpastas sendo copiadas. O / SEC copiará toda a segurança do arquivo e carimbos de hora.


Hmmm, suponho que você possa usar / XF c: *. * Para excluir todos os arquivos raiz. Vou testar isso quando estiver na frente de uma máquina e não no telefone.
opsin

Não, c: *. * É inválido, você terá que listar manualmente todos os arquivos.
opsin 29/01

0

Em teoria, o uso /DCOPY:Tdeve resolver todos os seus problemas.

Mas já vi isso acontecer, e não tenho certeza se chamaria de "bug", mas uma consequência da sequência de operações (OK, bug).

Este comando deve funcionar para copiar todos os arquivos de C:\Brushespara D:\NEWBrushese /DCOPY:Tdeve fazer com que os carimbos de data e hora da pasta de origem sejam copiados para a pasta de destino:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

O que eu vi (pelo menos em algumas versões do Robocopy) é que o comando é bem-sucedido, mas o carimbo de data e hora da D:\NEWBrushespasta está definido para a data e hora atuais.

Portanto, parece que o /DCOPY:Trecurso não funciona para a pasta "base" (mais acima) que você está copiando.

Acredito que esteja funcionando, mas que o registro de data e hora da pasta de destino está sendo "pisado" por operações que são posteriormente na sequência da operação.

O que acredito estar acontecendo para esse comando:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

é algo como isto:

  1. Crie uma pasta D:\NEWBrushesse ela ainda não existir
  2. Copie o carimbo de data e hora de C:\BrushesparaD:\NEWBrushes
  3. Copie arquivos e subpastas de C:\BrushesparaD:\NEWBrushes

Parece que a Etapa 3, a modificação do conteúdo da pasta, D:\NEWBrushesfaz com que o carimbo de data / hora D:\NEWBrushesseja alterado.

Para mim, a "solução alternativa" foi executar o robocopycomando para copiar os arquivos e pastas e, em seguida, executar o (mesmo) robocopycomando pela segunda vez.

Então, a primeira vez que você executa:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

todos os arquivos e pastas serão copiados. Em seguida, execute-o novamente:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T
  (or)
robocopy "C:\Brushes" "D:\NEWBrushes" /DCOPY:T

Na segunda vez que for robocopyexecutado, nenhum arquivo ou pasta D:\NEWBrushesserá modificado e a /DCOPY:Topção informará robocopypara copiar o carimbo de data / hora de C:\Brushespara D:\NEWBrushes(a menos que haja pastas / arquivos C:\Brushesque foram alterados desde a primeira execução de robocopy).


-1

Eu estava resolvendo as pastas raiz agora mesmo para um script de backup realmente rápido e fácil com robocopy, há um exemplo. Deve ajudar a qualquer pessoa:

$Destination="F:\Backup" #change destionation backup drive and foder
$BackupDirs="d:\folder1", "d:\folder2", "d:\folder3\subfolder", "d:\fodler4\subfolder\subsubfodler" #change source folders

#make a loop for every source folder
foreach ($Backup in $BackupDirs) {

#split folder name
$fdname = Split-Path $Backup -leaf

#define folder to create in destionation
$dirtocreate = Join-Path $Destination $fdname

#make directory, yes, some extra script to skip when exist should be in place, but -erroraction solved this in lazy mode :)
md $dirtocreate -ErrorAction SilentlyContinue 

#copy with subfolders and log
robocopy $backup $dirtocreate  /s /nfl /ndl /log:c:\scripts\backup.log

}

Portanto, use este PowerScript e o problema foi resolvido, certo?
Pimp Juice IT
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.