将来自 robocopy 命令的日志保存到日期日志文件

Saving log from the robocopy command to a dated log file

我运行使用以下命令将文件夹备份到映射为驱动器的远程共享:

REM Backup local documents to Q drive, only add new files does not remove old
REM files
echo --------------------------------------------------------------------------
echo Running backup to Q batch, only adding new files
echo --------------------------------------------------------------------------
robocopy C:\WhatIWantToCopy^
    Q:\ /256 /V /S /IPG:125^
    /XF *.log /tee /ETA /XC /XN /XO^ 
    /XD C:\SomeRubbish^
    /log:C:\MyStuff\logs\robo_%_DATETIME.log

命令执行但行:

/log:C:\MyStuff\logs\robo_%_DATETIME.log

似乎没有生成所需的日志文件。我希望日志文件的结构为 robo_16-12-2015.log,反映当前日期。

您需要以您想要的格式构建日期。这个片段应该有帮助:

@ECHO OFF

ECHO Date: %DATE%
ECHO Time: %TIME%

SET _datetime=%DATE:~7,2%-%DATE:~4,2%-%DATE:~10,4%
ECHO %_datetime%

在我的机器上,输出:

Date: Wed 12/16/2015
Time: 14:42:08.21
16-12-2015

如果您想包含小时-分钟时间戳,只需相应地更新解析 %TIME% 变量:

SET _datetime=%DATE:~7,2%-%DATE:~4,2%-%DATE:~10,4%_%TIME:~0,2%-%TIME:~3,2%

我解决这个问题如下:我的服务器returns这个:

@ECHO OFF

ECHO Date: %DATE%
ECHO Time: %TIME%

Date: Thu 06/29/2017
Time: 11:19:24.02

现在,我想使用文件名中包含 "Year-Month-Day--Hour-Minute-Second" 部分的 Robocopy 日志文件。这里的挑战是摆脱 / 和 : 字符,因为这些字符在文件名中是不允许的。

解决方法:创建一个批处理文件,例如setdtvar.cmd,里面有这个:

@ECHO OFF

ECHO Date: %DATE%
ECHO Time: %TIME%

SET DTVARYEAR=%DATE:~10%
ECHO %DTVARYEAR%

SET DTVARDAY=%DATE:~7,2%
ECHO %DTVARDAY%

SET DTVARMONTH=%DATE:~4,2%
ECHO %DTVARMONTH%

SET DTVARTIMEHRS=%TIME:~0,2%
ECHO %DTVARTIMEHRS%

SET DTVARTIMEMIN=%TIME:~3,2%
ECHO %DTVARTIMEMIN%

SET DTVARTIMESEC=%TIME:~6,2%
ECHO %DTVARTIMESEC%

SET DTVAR=%DTVARYEAR%-%DTVARMONTH%-%DTVARDAY%--%DTVARTIMEHRS%-%DTVARTIMEMIN%-%DTVARTIMESEC%

ECHO %DTVAR%

在我的服务器上,DTVAR 变量现在 returns 我需要的格式的日期和时间,例如:

2017-06-29--11-19-24

为 Robocopy 启用此功能:每个包含 robocopy 命令的批处理文件首先调用 setdtvar.cmd 文件(在第一行调用 setdtvar.cmd)。这会在运行批处理文件的进程的上下文中设置 DTVAR 变量。然后,在 Robocopy 日志文件命令中,我在日志文件的文件名中使用 %DTVAR%。

要回答原始问题,您可以使用以下代码。此代码还支持在 DATE 变量中列出一天的旧系统。

SET sDate=%DATE%
SET "sFirstChar=%sDate:~0,1%"
SET "sNum="&FOR /f "delims=0123456789" %%i in ("%sFirstChar%") DO SET sNum=%%i
IF DEFINED sNum ( GOTO DateHasDay ) ELSE ( GOTO DateHasNoDay )
:DateHasDay
SET sDate=%sDate:~4%
SET sDate=%sDate:~3,2%-%sDate:~0,2%-%sDate:~-4,4%
GOTO DateSet
:DateHasNoDay
SET sDate=%sDate:~3,2%-%sDate:~0,2%-%sDate:~-4,4%
:DateSet
ECHO C:\MyStuff\logs\robo_%sDate%.log

只是为了添加一种多年来对我很有帮助并避免名称冲突的更简单的方法。下面是我在我的脚本文件中用作 robocopy 迁移脚本的片段。每次 运行 时,我都使用它来生成新的日志文件名。我拥有的这个特定脚本的名称叫做 "migrate.bat"。如您所见,此代码将使用脚本的名称,然后吐出一个漂亮的日志文件名以供使用。

:: Generate date and time stamp for backups
SET sDateTime=%DATE%
SET "sFirstChar=%sDateTime:~0,1%"
SET "sNum="&FOR /f "delims=0123456789" %%i in ("%sFirstChar%") DO SET sNum=%%i
IF DEFINED sNum ( GOTO DateHasDay ) ELSE ( GOTO DateHasNoDay )
:DateHasDay
SET sDateTime=%sDateTime:~4%
SET sDateTime=%sDateTime:~-4,4%%sDateTime:~0,2%%sDateTime:~3,2%
GOTO DateSet
:DateHasNoDay
SET sDateTime=%sDateTime:~-4,4%%sDateTime:~0,2%%sDateTime:~3,2%
:DateSet
SET sHr=%TIME:~0,2%
IF "%sHr:~0,1%"==" " SET sHr=0%sHr:~1,1%
SET sMin=%TIME:~3,2%
IF "%sMin:~0,1%"==" " SET sMin=0%sMin:~1,1%
SET sSec=%TIME:~6,2%
IF "%sSec:~0,1%"==" " SET sSec=0%sSec:~1,1%
SET sDateTime=%sDateTime%-%sHr%%sMin%%sSec%
SET sLogFileSuffix=-%sDateTime%.log

然后看看它长什么样...

ECHO %~n0%sLogFileSuffix%

应该return像...

migrate-20181022-082516.log