Como copiar um arquivo para um destino somente se o arquivo de origem for mais recente que qualquer um dos arquivos de destino?

0

Estou procurando uma maneira de realizar essa tarefa. Eu tentei robocopy e escrever um arquivo de lote, mas robocopy parece não ser capaz de fazê-lo (desde / MINAGE não pode fazer o tempo - apenas datas), e escrever um arquivo de lote para fazer tudo isso é um pouco além de mim, uma vez que fica um pouco complicado e se transforma em código espaguete.

1) Alguém carrega um arquivo em uma pasta de origem em um servidor (unidade S).

2) Algumas estações de trabalho verificam a unidade S periodicamente (uma vez a cada 5 minutos).

3) A estação de trabalho possui um arquivo em uma pasta de destino. Se a estação de trabalho perceber que a unidade S possui um arquivo mais recente que o arquivo na pasta de destino da estação de trabalho, a estação de trabalho copiará apenas o arquivo mais recente da unidade S para a pasta de destino. Nomes de arquivo não importam aqui - apenas o timestamp faz.

Por outro lado, se a pasta de destino da estação de trabalho tiver um arquivo com o mesmo carimbo de data / hora mais recente que o da unidade S (mesmo que seja um nome de arquivo diferente), ele não deverá copiar o arquivo.

4) A estação de trabalho executa um arquivo de lote separado para renomear e processar o novo arquivo.

    
por Force Flow 29.01.2015 / 18:37

2 respostas

1

Para simplificar sua pergunta (pelo que entendi), você deseja:

  1. Olhe para o diretório de origem e obtenha o arquivo mais recente
  2. Olhe para o diretório de destino e obtenha o arquivo mais recente
  3. compare os carimbos de tempo desses dois arquivos
  4. Se o arquivo de diretório de origem (etapa 1) for mais recente que o arquivo de diretório de destino (etapa 2), copie-o para o diretório de destino.
  5. Se copiado, renomeie o novo arquivo no diretório de destino.

Os passos 1 e 2 podem ser realizados com um loop:

set SOURCE_SERVER=\server\source
set DEST_SERVER=C:\Destination Folder

set SOURCE_LATEST=
set DEST_LATEST=

REM Latest timestamp in the source directory
for /f "tokens=*" %%A in ('dir "%SOURCE_SERVER%\*.*" /b /o:-d') do (
    if not defined SOURCE_LATEST set SOURCE_LATEST=%%~fA)

REM latest timestamp in the destination directory
for /f "tokens=*" %%A in ('dir "%DEST_SERVER%\*.*" /b /o:-d') do (
    if not defined DEST_LATEST set DEST_LATEST=%%~fA)

Mais ajuda nisso: Como eu escrevo um script em lote do Windows para copiar o arquivo mais novo de um diretório?

Etapa 3 : agora você conhece o arquivo mais recente em cada local. Tempo para comparar seus timestamps para ver qual arquivo é mais novo. Podemos usar o wmic para recuperar um registro de data e hora para cada arquivo que pode ser comparado com operadores relacionais: por exemplo, 20150129113038 (o que equivale a 29 de janeiro de 2015 às 11:30:38) é maior que 20150129112533 (29 de janeiro de 2015 às 11:25:33).

set DEST_FILE_DATE=
set SOURCE_FILE_DATE=

for /f "tokens=1 skip=1 delims=." %%A in ('wmic datafile where name^="%SOURCE_LATEST:\=\%" get "Last Modified"') do (
    if not defined SOURCE_FILE_DATE set SOURCE_FILE_DATE=%%A)

for /f "tokens=1 skip=1 delims=." %%A in ('wmic datafile where name^="%DEST_LATEST:\=\%" get "Last Modified"') do (
    if not defined DEST_FILE_DATE set DEST_FILE_DATE=%%A)

Idéias adicionais sobre essa última comparação podem ser encontradas aqui: Como faço para comparar timestamps de arquivos em um script em lotes do DOS?

Etapas 4 e 5 : Por fim, determine se o arquivo mais recente é o que está no servidor de origem e copie + renomeie conforme necessário.

if "%SOURCE_FILE_DATE%" gtr "%DEST_FILE_DATE%" (
    REM copy the source file to the destination and rename it as desired.
    copy "%SOURCE_LATEST%" "%DEST_SERVER%\new file name.ext"
) else (
    REM Wait 5 minutes and try again
    timeout /T 300
    goto :START
)
    
por 29.01.2015 / 21:48
0

Como sobre o seguinte arquivo em lote

xcopy "\\ Servidor de Origem \ Caminho de Origem" "c: \ Caminho de Destino" / C / D / Y

é claro que as "marcas só são necessárias se houver espaços nos nomes.

Usa a hora UTC para comparação. (Tempo Universal Coordenado)

    
por 24.02.2017 / 01:01