此批处理文件可用于此任务:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FilesToIgnore=1"
set "theYear=%DATE:~-4%"
set "ListFile=%Temp%\%~n0.lst"
del "%ListFile%" 2>nul
for /D %%I in (*) do call :CompressFiles "%%I"
goto EndBatch
:CompressFiles
pushd %1
set "ZipFile=%~nx1%theYear%.zip"
for /F "skip=%FilesToIgnore% eol=| delims=" %%J in ('dir /A-D /B /O-D /TW 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"%ZipFile%"') do >>"%ListFile%" echo %%J
if exist "%ListFile%" (
echo Compressing files in directory %1 ...
7z.exe a -bd -bso0 -i"@%ListFile%" -mx9 -scsDOS -- "%ZipFile%"
del "%ListFile%"
)
popd
goto :EOF
:EndBatch
endlocal
批处理文件设置环境变量theYear
动态地从动态环境变量的区域相关日期字符串DATE
。请在命令提示符窗口中执行echo %DATE:~-4%
并验证输出是否是当前年份,因为echo %DATE%
输出当前本地日期,最后四个字符是年份。
批处理文件忽略FilesToIgnore
每个目录中的最新文件。如果 ZIP 文件在上次执行批处理文件时已存在,则也会被忽略。 ZIP 文件从不包含在数量中FilesToIgnore
因为已经被过滤掉了findstr
过滤命令的输出dir
它输出当前目录中不带路径的文件名,按上次修改时间排序,最新的文件首先输出,最旧的文件最后输出。
请阅读帮助7-Zip对于所使用的开关和参数。
为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
del /?
dir /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
popd /?
pushd /?
set /?
setlocal /?
阅读 Microsoft 文章:使用命令重定向运算符 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490982(v=technet.10)的解释2>nul
and |
。重定向运算符>
and |
必须用插入符号转义^
on FOR当 Windows 命令解释器在执行命令之前处理此命令行时,命令行将被解释为文字字符FOR它使用在后台启动的单独命令进程来执行嵌入式命令行。
Update: 7-Zip版本 19.00.0.0 会输出警告,并在使用命令行时在每个子目录中创建一个空 ZIP 文件,如下所示并最初在批处理文件中使用。我首先认为这是一个错误7-Zip版本 19.00.0.0 因为这个版本也应该支持--
根据其帮助和7-Zip版本 16.04.0.0 可使用命令行:
7z.exe a -bd -bso0 -mx9 -scsDOS -- "%ZipFile%" "@%ListFile%"
有必要删除--
从这个命令行让它工作7-Zip版本 19.00.0.0。
So I 报告了此问题 https://sourceforge.net/p/sevenzip/bugs/2221/7-Zip 的作者很快回复解释了为什么使用--
结果搜索以以下内容开头的文件@
在文件名中自7-Zip版本 19.00.0.0:
我们需要一些方法来添加@file
and -file
来自命令行的名称。
So --
stops @
and -
解析,7-Zip 搜索确切的名称。
使用起来更安全-i@listfile
反而。
所以我更新了批处理文件代码并使用选项指定列表文件-i
这是指定列表文件最安全的方法。