我正在运行以下命令将文件夹备份到映射为驱动器的远程共享:
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 ,反映当前日期。
答案 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