以下代码可用于以dd_MM_yyyy_hhmmss 格式获取当前日期和时间,而无需为用于运行批处理文件的帐户配置哪个国家/地区:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist %SystemRoot%\System32\robocopy.exe for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do set "CurrentDateTime=%%K_%%J_%%I_%%L%%M%%N" & goto CopyDirectory
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDateTime=%%I"
set "CurrentDateTime=%CurrentDateTime:~6,2%_%CurrentDateTime:~4,2%_%CurrentDateTime:~0,4%_%CurrentDateTime:~8,6%"
:CopyDirectory
%SystemRoot%\System32\xcopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%CurrentDateTime%\" /C /E /H /I /K /Q /R /Y >nul
endlocal
代码使用 ROBOCOPY 来获取独立于可用的当前日期时间区域,这是 Windows Vista 和 Windows Server 2003 以及所有更高版本的 Windows 版本的默认情况。在默认情况下 ROBOCOPY 不可用的 Windows XP 上使用 WMIC 慢得多的解决方案。
有关用于获取当前日期和时间区域独立于 ROBOCOPY 或 WMIC 的三个命令行的详细说明,请阅读我在 Time is set incorrectly after midnight 上的回答。
另请参阅我在single line with multiple commands using Windows batch file 上的回答以了解运算符& 的解释,该运算符用于在定义环境变量CurrentDateTime 后立即运行命令GOTO 作为处理第一行的结果ROBOCOPY 输出的日期和时间导致在处理下一行之前退出循环。
最好使用日期/时间格式yyyy-MM-dd_hhmmss,这是国际日期格式。它的一大优点是C:\temp\HTML_Reports 中名称为HTML_Reports_yyyy-MM-dd_hhmmss 的多个子目录按名称字母顺序显示,同时也按时间顺序显示。这确实有助于通过 HTML 报告更好地了解目录。
日期/时间格式yyyy-MM-dd_hhmmss所需的代码,尽可能不写在单个命令行上以最有效地执行:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist %SystemRoot%\System32\robocopy.exe (
for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do (
%SystemRoot%\System32\robocopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%%I-%%J-%%K_%%L%%M%%N" /E /R:3 /W:2 /NDL /NFL /NJH /NJS
goto EndBatch
)
)
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDateTime=%%I"
set "CurrentDateTime=%CurrentDateTime:~0,4%-%CurrentDateTime:~4,2%-%CurrentDateTime:~6,2%_%CurrentDateTime:~8,6%"
%SystemRoot%\System32\xcopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%CurrentDateTime%\" /C /E /H /I /K /Q /R /Y >nul
:EndBatch
endlocal
此批处理文件使用 ROBOCOPY 来获取与区域无关的当前日期和时间,并在可用时复制目录。否则 WMIC 用于获取与当前日期和时间无关的区域,而 XCOPY 用于复制目录。
整个任务可以用一个只包含一个命令行的批处理文件来完成:
@for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do @%SystemRoot%\System32\robocopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%%I-%%J-%%K_%%L%%M%%N" /E /R:3 /W:2 /NDL /NFL /NJH /NJS & goto :EOF
要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
goto /?
if /?
robocopy /?
set /?
setlocal /?
wmic /?
wmic os /?
wmic os get /?
wmic os get localdatetime /?
xcopy /?