如何使用xcopy将当前目录中的所有文件复制到以当前日期命名的子目录文件夹中?

时间:2017-02-05 05:41:57

标签: batch-file

我有一个启动服务器jar文件的批处理脚本,但在运行之前我想让它复制工作目录中的所有内容并将其粘贴到一个以当前日期和时间命名的新文件夹中,并使用新的工作目录外的文件夹。我该如何修复这个脚本?

@echo off
xcopy \ "C:\Users\my name\serverBackups\%date%" /s/e /h /z /f /l
java -Xms256M -Xms1G -d64 -jar server.jar 
pause

1 个答案:

答案 0 :(得分:0)

此批处理代码可用于任务:

@echo off
setlocal EnableExtensions
for /F "skip=1 tokens=1 delims=." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime') do set "DateTimeLocal=%%I" & goto ReformatDateTime
:ReformatDateTime
set "DateTimeFolder=%DateTimeLocal:~0,4%-%DateTimeLocal:~4,2%-%DateTimeLocal:~6,2%_%DateTimeLocal:~8,2%-%DateTimeLocal:~10,2%-%DateTimeLocal:~12,2%"
%SystemRoot%\System32\xcopy.exe * "%USERPROFILE%\ServerBackups\%DateTimeFolder%\" /C /E /H /I /K /Q /R /Y
java.exe -Xms256M -Xms1G -d64 -jar server.jar 
endlocal

FOR 执行的第一个命令行是:

C:\Windows\System32\wbem\wmic.exe OS GET LocalDateTime

此命令输出以处理 STDOUT ,例如以下两行:

LocalDateTime
20170205125750.125000+060

现在通过命令 FOR 处理此输出。

由于选项skip=1,第一行不感兴趣,因此被跳过。

从第二行开始,只有用tokens=1引用的第一个字符串到用作delims=.的字符串分隔符的点是有意义的,因为它包含格式为{{1}的格式的当前本地日期和时间}。日期/时间字符串分配给环境变量YYYYMMDDhhmmss

使用DateTimeLocal的优点是日期/时间格式独立于Windows区域和语言设置,而环境变量wmic OS GET LocalDateTime的日期字符串格式和环境变量的时间字符串格式{ {1}}取决于Windows区域和语言设置。

使用DATE的缺点是,与引用环境变量TIMEwmic OS GET LocalDateTime的值相比,执行此命令需要更长的时间。但是,这个缺点在每个批处理文件执行一次运行DATE时没有问题。

接下来,使用字符串替换将日期/时间字符串重新格式化为TIME,以使日期/时间更易于人类阅读。按名称排序的文件夹也会使用此格式按日期/时间自动排序。但其他格式如wmic也是可能的。

因此字符串YYYY-MM-DD_hh-mm-ss会重新格式化为DD.MM.YYYY hh.mm.ss并分配给环境变量20170205125750

接下来在 XCOPY 命令行中使用此重新格式化的日期/时间字符串,其中目标文件夹字符串以反斜杠结尾非常重要,以使2017-02-05_12-57-50清除目标文件夹指定目录而不是文件。

另一种解决方案是另外使用DateTimeFolder选项xcopy

wmic

此选项将输出格式更改为:

/VALUE

这使得可以稍微简化批处理代码:

%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE

以下是使用环境变量LocalDateTime=20170205125750.125000+060 @echo off setlocal EnableExtensions for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "DateTimeLocal=%%I" set "DateTimeFolder=%DateTimeLocal:~0,4%-%DateTimeLocal:~4,2%-%DateTimeLocal:~6,2%_%DateTimeLocal:~8,2%-%DateTimeLocal:~10,2%-%DateTimeLocal:~12,2%" %SystemRoot%\System32\xcopy.exe * "%USERPROFILE%\ServerBackups\%DateTimeFolder%\" /C /E /H /I /K /Q /R /Y java.exe -Xms256M -Xms1G -d64 -jar server.jar endlocal 预测德国国家/地区格式的日期和时间的示例,这意味着DATE正在使用格式TIME和{ {1}}使用格式DATE使用24小时格式,前导零为日,月,小时,分钟和秒小于10,这意味着DD.MM.YYYY TIME以上的日期/时间示例hh:mm:ss,xx 1}}和05.02.2017 DATE

12:57:50.12

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • TIME
  • @echo off setlocal EnableExtensions set "DateTimeFolder=%DATE:~-4%-%DATE:~-7,2%-%DATE:~-10,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%" %SystemRoot%\System32\xcopy.exe * "%USERPROFILE%\ServerBackups\%DateTimeFolder%\" /C /E /H /I /K /Q /R /Y >nul endlocal
  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic OS /?