我有一个简单的 Windows 批处理脚本,它由备份软件作为备份前操作运行。它只是查找最新的 SQL 转储,将它们压缩为 10 倍小的 7zip 存档,然后云备份会将其拾取并发送到云存储进行存档。
BATCH 创建以 DATE 开头的文件名: 07-10-2018-bak.7z
但是我对 BATCH 文件有问题:
- 当我手动运行它时,它执行得很好并创建文件名07-10-2018-bak.7z在提供的文件夹中
- 但是当我通过备份软件(以系统用户身份)运行它作为预备份操作时,它会为每个 DASH 创建子文件夹,如下所示:
\07\10\2018-bak.7z
我执行了ECHO
每条命令行,结果都很好。即使我手动运行回显的命令行,它们也不会创建文件夹,但它们应该会创建包含日期的完整文件名:
"c:\Program Files\7-Zip\7z.exe" a -mx7 -stl -y "D:\SQL\Backup-Last-Only\\**07-10-2018-bkp.7z**" "D:\SQL\Backup\SklSistem_FULL_sob.BAK"
知道我遗漏了什么重点吗?
@echo off & setlocal enabledelayedexpansion
del D:\SQL\Backup-Last-Only\*.7z /Q
time/t|find "M" && set t=1,4* || set t=1,3*
for /f "skip=1 tokens=%t%" %%a in ('dir/a-d/tw/o-d D:\SQL\Backup\*FULL*.BAK^|find ":"') do (
if %%a==%date:~-10% (
set archdate=%%a
set archdate=!archdate:.=-!
"c:\Program Files\7-Zip\7z.exe" a -mx7 -stl -y "D:\SQL\Backup-Last-Only\!archdate!-bkp.7z" "D:\SQL\Backup\%%c"
) else goto:eof
)
答案1
此问题可能是由于“日期格式“以及%DATE%
使用时脚本生成的环境变量输出”您手动运行的帐户y” 与设置为“备份软件执行该操作的用户帐户“。
您只需要使用set archdate=!archdate:/=-!
而不是用set archdate=!archdate:.=-!
“替换”而不是“替换”由于您遇到的问题的日期格式差异,您可以使用当前的逻辑进行解释。/
-
.
-
此外,你还应该考虑使用一些更通用的东西例如wmic os get LocalDateTime
设置不依赖于每个用户帐户配置文件设置的日期格式/语言环境的变量 - 请参阅批处理文件中不区分语言环境的 %DATE% 和 %TIME%了解一些细节。
脚本
@echo off & setlocal enabledelayedexpansion
del D:\SQL\Backup-Last-Only\*.7z /Q
time/t|find "M" && set t=1,4* || set t=1,3*
for /f "skip=1 tokens=%t%" %%a in ('dir/a-d/tw/o-d D:\SQL\Backup\*FULL*.BAK^|find ":"') do (
if %%a==%date:~-10% (
set archdate=%%a
set archdate=!archdate:/=-!
"c:\Program Files\7-Zip\7z.exe" a -mx7 -stl -y "D:\SQL\Backup-Last-Only\!archdate!-bkp.7z" "D:\SQL\Backup\%%c"
) else goto:eof
)