Robocopy:如何将资产从多个位置复制到一个位置并维护日志

Robocopy:如何将资产从多个位置复制到一个位置并维护日志

我有多个包含资产的文件夹(每个文件夹都有包含这些资产 .mp3、.txt、.png 等的子文件夹)。我想将所有这些资产连同子文件夹一起复制到一个位置/文件夹。我能够成功运行 robocopy 命令来实现将资产连同子文件夹从一个文件夹复制到另一个文件夹:

robocopy source target /s

我将每天运行一次调度程序来复制资产。我还想将所有复制资产的名称存储在日志文件中。日志文件的名称应采用以下格式

日志当前日期.txt

例如,如果今天的日期是 2015 年 10 月 20 日...日志文件的名称应该是:

log_20151020.txt

第二天,即2015年10月21日,应该是:

log_20151021.txt

此日志文件应包含 2015 年 10 月 20 日、2015 年 10 月 21 日等日期复制的所有资产的名称。我创建了一个批处理命令(感谢@DavidPostill)来创建日志,如下所示:

@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

这将创建一个名为“logTue2010.txt”的日志(即logdayddmm格式)。问题:

  1. 这个日志文件存储在哪里?为了显示这个日志文件,我必须每天编写一个单独的命令,如下所示:

robocopy 源目标 /log:D:\ABC\logWed1021.txt /tee /s

  1. 我如何确保每天获得一份单独的日志副本?
  2. 此外,使用当前命令,日志文件包含 cmd 窗口上显示的全部输出。我只希望它包含资产的名称及其扩展名。

编辑1:使用以下批处理命令,我能够解决与日志文件名格式有关的问题:

@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

这个批处理命令也同样有效:

@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

然而这里提出的其他问题仍然没有得到解答。

答案1

请不要反问StackExchange相同的问题。已回答https://serverfault.com/q/730450/257436如下:


使用获取YYYYMMDD独立于语言环境和区域设置的格式化日期for /F环形反对wmicWindows 管理规范命令) 和环境变量子字符串

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

还有更多robocopy 日志记录选项

            /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.

答案2

这个日志文件存储在哪里?为了显示这个日志文件,我必须每天编写一个单独的命令

这是因为您没有删除最后一个echo或添加/s批处理文件。

我昨天在我们漫长的聊天

我也更新了我的回答告知您需要做什么:

  • 如果您对日期格式满意,请删除最后一个回声
  • 如果源目录包含需要复制的子目录,请使用 /s。

以下是包含这些更改的批处理文件:

@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

我也在聊天中说过:

您还需要更改批处理文件以获取适合您语言环境的正确日期格式。

您的 PC 上的命令提示符中的 date /t 输出是什么?

我之所以问这个问题,是因为我发现批处理文件在你的电脑上日期格式错误(但在我的电脑上是正确的)。我从来没有得到过这个问题的答复(所以日期格式仍然没有得到解决)。

作为约瑟夫正确指出他的回答无论您的语言环境如何,获取所需日期格式(log_ddmmyy.txt)的更好方法是使用wmic

经过这些更改后,最终的批处理文件将变成:

@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

现在,最后一步是修改日志文件格式,因为您希望包含资产名称及其扩展名:

  • 使用中描述的开关约瑟夫回答去做这个。

  • 尝试使用这些开关来获得您想要的确切格式。提示:我认为您需要使用其中几个开关。

答案3

因此,为了让 RoboCopy 仅包含文件名,需要添加 /NDL /NC /NS /NJH /NJS。

我已经多次使用过这个。

相关内容