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



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

@echo off
xcopy  "C:Usersmy nameserverBackups%date%" /s/e /h /z /f /l
java -Xms256M -Xms1G -d64 -jar server.jar 
pause

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

@echo off
setlocal EnableExtensions
for /F "skip=1 tokens=1 delims=." %%I in ('%SystemRoot%System32wbemwmic.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%System32xcopy.exe * "%USERPROFILE%ServerBackups%DateTimeFolder%" /C /E /H /I /K /Q /R /Y
java.exe -Xms256M -Xms1G -d64 -jar server.jar 
endlocal

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

C:WindowsSystem32wbemwmic.exe OS GET LocalDateTime

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

LocalDateTime
20170205125750.125000+060

此输出现在由命令FOR处理。

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

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

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

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

接下来,使用字符串替换将日期/时间字符串重新格式化为YYYY-MM-DD_hh-mm-ss,以使日期/时间更易于人类阅读。使用此格式,按名称排序的文件夹也会按日期/时间自动排序。但像DD.MM.YYYY hh.mm.ss这样的其他格式也是可能的。

因此,字符串20170205125750被重新格式化为2017-02-05_12-57-50并分配给环境变量DateTimeFolder

接下来在XCOPY命令行中使用此重新格式化的日期/时间字符串,其中目标文件夹字符串必须以反斜杠结尾,以便xcopy清楚地表明目标指定了目录而不是文件。

另一种解决方案是另外使用wmic选项/VALUE

%SystemRoot%System32wbemwmic.exe OS GET LocalDateTime /VALUE

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

LocalDateTime=20170205125750.125000+060

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

@echo off
setlocal EnableExtensions
for /F "tokens=2 delims==." %%I in ('%SystemRoot%System32wbemwmic.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%System32xcopy.exe * "%USERPROFILE%ServerBackups%DateTimeFolder%" /C /E /H /I /K /Q /R /Y
java.exe -Xms256M -Xms1G -d64 -jar server.jar 
endlocal

这里还有一个使用环境变量的示例DATETIME德国国家/地区的预期日期和时间格式,这意味着DATE使用格式DD.MM.YYYYTIME使用格式hh:mm:ss,xx使用 24 小时格式和天、月、小时、分钟和小于 10 的秒的前导零,这意味着对于上面的日期/时间示例,05.02.2017用于DATE12: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%System32xcopy.exe * "%USERPROFILE%ServerBackups%DateTimeFolder%" /C /E /H /I /K /Q /R /Y >nul
endlocal

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

  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic OS /?
  • wmic OS GET /?
  • xcopy /?

最新更新