将日志从robocopy命令保存到日期日志文件

时间:2015-12-16 17:04:26

标签: datetime batch-file logging cmd robocopy

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

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 ,反映当前日期。

3 个答案:

答案 0 :(得分:1)

您需要以所需的格式构建日期。这段剪辑应该有所帮助:

@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%

答案 1 :(得分:1)

我解决了这个问题如下:我的服务器返回:

@ECHO OFF

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

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

现在,我想使用一个带有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变量现在以我需要的格式返回日期和时间,例如:

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

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

答案 2 :(得分:1)

要回答原始问题,可以使用以下代码。该代码还支持在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%

应该返回类似...

  

migrate-20181022-082516.log

相关问题