Robocopy: como copiar ativos de vários locais para um único local e manter um log

0

Eu tenho várias pastas contendo ativos (cada pasta tem subpastas contendo esses recursos .mp3, .txt, .png, etc). Quero copiar todos esses recursos junto com a subpasta para um único local / pasta. Consegui executar com êxito um comando robocopy para obter cópias de recursos junto com subpastas de uma pasta para outra:

robocopy source target /s

Eu estarei executando um agendador uma vez por dia para copiar os ativos. Também queria armazenar o nome de todos os ativos copiados em um arquivo de log. O nome do arquivo de log deve estar na forma de

log_currentDate.txt

por exemplo, se a data de hoje for 20 de outubro de 2015 ... o nome do arquivo de log deve ser:

log_20151020.txt

No dia seguinte, ou seja, 21 de outubro de 2015, deve ser:

log_20151021.txt

Este arquivo de registro deve conter o nome de todos os recursos copiados em 20 de outubro de 2015, 21 de outubro de 2015 e assim por diante. Eu criei um comando em lote (graças a @DavidPostill) para criar um log da seguinte forma:

@echo off
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (
set _date=%%a%%b%%c
)
echo robocopy source target /log:D:\ABC\log%_date%.txt

Isso cria um log com o nome "logTue2010.txt" (ou seja, formato logdayddmm). Problema:

  1. Onde esse arquivo de log é armazenado? Para tornar visível este arquivo de log, eu tenho que escrever um comando separado todos os dias da seguinte forma:

robocopy source target /log:D:\ABC\logWed1021.txt /tee /s

  1. Como posso garantir que uma cópia separada do log seja obtida a cada dia?
  2. Também com o comando atual, o arquivo de log contém toda a saída exibida na janela cmd. Eu só quero que ele contenha o nome do ativo com sua extensão.

EDIT 1: Com o seguinte comando em lote, consegui resolver o problema relacionado ao formato do nome do arquivo de log:

@ECHO OFF
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a)
ECHO %ts:~0,8%_%ts:~8,4%
echo robocopy ship shore /log:D:\HAL\log\log_%ts:~0,8%_%ts:~8,4%.txt
robocopy Ship Shore /log:D:\HAL\log\log_%ts:~0,8%_%ts:~8,4%.txt /S

Este comando batch também funcionou:

@echo off
for /f "tokens=2 delims==" %%G in ('wmic OS get LocalDateTime /value') do set "_date=%%G"
set "_date=%_date:~0,8%"
echo robocopy ship shore /log:D:\HAL\log\log_%_date%.txt
robocopy ship shore /log:D:\HAL\log\log_%_date%.txt /S

No entanto, outras perguntas feitas aqui ainda não foram respondidas.

    
por Yash Saraiya 21.10.2015 / 06:53

3 respostas

1

Por favor, não faça uma pergunta cruzada StackExchange da mesma pergunta. Respondeu já no link da seguinte forma:

Obtenha a YYYYMMDD -formatted date independentemente das configurações locais e regionais usando for /F loop em relação a wmic ( Comando de instrumentação de gerenciamento do Windows ) e substring de variável de ambiente :

@echo off
for /f "tokens=2 delims==" %%G in ('wmic OS get LocalDateTime /value') do set "_date=%%G"
set "_date=%_date:~0,8%"

Existem mais robocopy opções de registro :

            /L : List only - don’t copy, timestamp or delete any files.
           /NP : No Progress - don’t display % copied.
      /unicode : Display the status output as Unicode text.   #
     /LOG:file : Output status to LOG file (overwrite existing log).
  /UNILOG:file : Output status to Unicode Log file (overwrite)
    /LOG+:file : Output status to LOG file (append to existing log).
 /UNILOG+:file : Output status to Unicode Log file (append)
           /TS : Include Source file Time Stamps in the output.
           /FP : Include Full Pathname of files in the output.
           /NS : No Size - don’t log file sizes.
           /NC : No Class - don’t log file classes.
          /NFL : No File List - don’t log file names.
          /NDL : No Directory List - don’t log directory names.
          /TEE : Output to console window, as well as the log file.
          /NJH : No Job Header.
          /NJS : No Job Summary.
    
por 21.10.2015 / 09:06
1

Where does this log file gets stored? To make visible this log file I have to write a separate command everyday

Isso porque você não removeu o último echo nem adicionou /s no arquivo em lote.

Expliquei isso ontem, durante nosso longo bate-papo .

Também atualizei minha resposta para informar o que você precisa fazer:

  • Remove the last echo if you are happy with the date format
  • Use /s if your source directory contains subdirectories that need copying.

Aqui está o arquivo em lote com essas alterações:

@echo off
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (
set _date=%%a%%b%%c
)
robocopy ship shore /log:%_date%.txt /s

Eu também disse no chat:

You also need to change the batch file to get the correct date format for your locale.

What is the output of date /t from a command prompt on your PC?

Eu perguntei isso porque eu podia ver que o arquivo de lote tinha o formato de data errado no seu PC (mas estava correto no meu). Eu nunca respondo a essa pergunta (então o formato da data não foi corrigido).

Como JosefZ aponta corretamente em seu answer a melhor maneira de obter o formato de data desejado ( log_ddmmyy.txt ), independentemente da sua localidade, é usar wmic .

Com essas alterações, o arquivo de lote final se torna:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%G in ('wmic OS get LocalDateTime /value') do (
  set _date=%%G
  set _date=!_date:~0,8!
  )
robocopy ship shore /log:D:\HAL\log_!_date!.txt /s
endlocal

Agora, o último passo para você é modificar o formato do arquivo de log como desejar para conter o nome do recurso com sua extensão:

  • Use os switches descritos em JosefZ 's responda para fazer isso.

  • Faça experiências com os comutadores para obter o formato exato desejado. Dica: Eu acho que você precisa usar vários desses switches.

por 21.10.2015 / 10:59
0

Portanto, para que o RoboCopy inclua apenas nomes de arquivos, é necessário adicionar / NDL / NC / NS / NJH / NJS.

Eu tenho usado muito isso.

    
por 29.10.2015 / 09:01