我有一个启动服务器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
的缺点是,与引用环境变量的值相比,执行此命令需要更长的时间DATE
和TIME
。但是这个缺点在这里没有问题,因为每个批处理文件执行只运行一次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
这里还有一个使用环境变量的示例DATE
和TIME
德国国家/地区的预期日期和时间格式,这意味着DATE
使用格式DD.MM.YYYY
,TIME
使用格式hh:mm:ss,xx
使用 24 小时格式和天、月、小时、分钟和小于 10 的秒的前导零,这意味着对于上面的日期/时间示例,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%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 /?