Usando o Robocopy para pesquisar e copiar diretórios usando correspondência de padrões

2

Eu tentei encontrar uma resposta para isso, mas a maioria das questões relacionadas a robocopy e correspondência de padrões são focadas em excluir pastas, enquanto minha intenção é incluir pastas.

Supondo que eu tenha as seguintes pastas.

c:\workspace\folder1\subfolder1\workInProgress monthly\*
c:\workspace\folder1\subfolder1\completed monthly\*
c:\workspace\folder1\subfolder1\rejected weekly\*

c:\workspace\folder2\subfolder2\workInProgress yearly\*
c:\workspace\folder2\workInProgress documents daily\*
c:\workspace\folder2\subfolder2\completed monthly\*
c:\workspace\folder2\subfolder21\rejected weekly\*

c:\workspace\folder3\subfolder3\workInProgress weekly\*
c:\workspace\folder3\subfolder3\completed daily\*
c:\workspace\folder3\subfolder3\rejected weekly\*

Eu tenho um script de backup que executa o comando ROBOCOPY para cada diretório que eu quero fazer backup.

ROBOCOPY "c:\workspace\folder1\subfolder1\workInProgress monthly" D:\folder1\subfolder1\workInProgress documents /COPYALL /B /SEC /E /MIR /Z /XO /XF *.LCK /R:5 /W:5 /LOG+:dSyncFilesMinimal_%vl%_%tl%.txt /IPG:5
ROBOCOPY "c:\workspace\folder2\subfolder2\workInProgress yearly" D:\folder2\subfolder1\workInProgress documents /COPYALL /B /SEC /E /MIR /Z /XO /XF *.LCK /R:5 /W:5 /LOG+:dSyncFilesMinimal_%vl%_%tl%.txt /IPG:5
ROBOCOPY "c:\workspace\folder2\workInProgress daily" D:\folder2\subfolder1\workInProgress documents /COPYALL /B /SEC /E /MIR /Z /XO /XF *.LCK /R:5 /W:5 /LOG+:dSyncFilesMinimal_%vl%_%tl%.txt /IPG:5
ROBOCOPY "c:\workspace\folder3\subfolder3\workInProgress weekly" D:\folder3\subfolder1\workInProgress documents /COPYALL /B /SEC /E /MIR /Z /XO /XF *.LCK /R:5 /W:5 /LOG+:dSyncFilesMinimal_%vl%_%tl%.txt /IPG:5

Toda vez que uma nova pasta é adicionada, tenho que atualizar o script para incluir a nova pasta. Como posso usar ROBOCOPY para pesquisar a pasta workspace para encontrar qualquer diretório que contenha a string workInProgress e copiá-lo para um local de destino.

Como sei que a pasta a ser copiada terá a string workInProgress em seu nome, é possível executar um único comando ROBOCOPY para pesquisar recursivamente o diretório c:\workspace e copiar em qualquer diretório que corresponda o padrão *workInProgress* "

  • Apenas pasta com padrão workInProgress
  • As pastas workInProgress podem conter strings diferentes depois que a string workInProgress , por exemplo,

    workInProgress daily   workInprogress unknown

  • Não há nenhum padrão conhecido em outras pastas que não contenham workInProgress em seu nome. Outras pastas podem conter nomes aleatórios.

por ziggy 20.05.2017 / 17:16

2 respostas

2

Um exemplo de dir usado em um loop FOR com como alterar a letra da unidade ao gerar o seguinte:

FOR /F "usebackq delims==" %i IN ('dir /s /a:d /b c:\workspace\workInProgress*') DO @echo "c:%~pi" "d:%~pi"
    
por 20.05.2017 / 23:53
1

Algo como isso provavelmente funcionaria para você.

$dirs = GetChildItem -recurse -include "*workinprogress*" | ?{ $_.PsIsContainer }

foreach ($dir in $dirs)
{
ROBOCOPY $dir.FullName D:\folder1\subfolder1\workInProgress documents /COPYALL /B /SEC /E /MIR /Z /XO /XF *.LCK /R:5 /W:5 /LOG+:dSyncFilesMinimal_%vl%_%tl%.txt /IPG:5
}
    
por 24.05.2017 / 00:14