Batch file 如何将文件夹每个子文件夹中特定年份修改的所有文件压缩到每个子文件夹的一个ZIP文件中?

Batch file 如何将文件夹每个子文件夹中特定年份修改的所有文件压缩到每个子文件夹的一个ZIP文件中?,batch-file,command-line,zip,archive,7zip,Batch File,Command Line,Zip,Archive,7zip,我以前问过以下问题,得到了一个很好的解决方案 现在在今年年底,我想修改这个解决方案,以便它将去年剩下的所有文件压缩到现有的zip文件中 目录结构如下所示: Directory-Parent ---Sub-Directory-1 --------File1 --------File2 --------File3 ---Sub-Directory-2 --------File1 --------File2 正如我在上一个问题中提到的,我有一个目录父级的批处理,该批处理将在所有文件的

我以前问过以下问题,得到了一个很好的解决方案

现在在今年年底,我想修改这个解决方案,以便它将去年剩下的所有文件压缩到现有的zip文件中

目录结构如下所示:

Directory-Parent
 ---Sub-Directory-1
 --------File1
 --------File2
 --------File3
 ---Sub-Directory-2
 --------File1
 --------File2
正如我在上一个问题中提到的,我有一个目录父级的批处理,该批处理将在所有文件的每个子目录中创建一个zip,但最新的文件(或我指定的数量)除外。它还将年份添加到zip文件名的末尾

因此,结果是:

Directory-Parent
 -Sub-Directory-1
 --------File1
 --------Sub-Directory-12019.zip
 ---Sub-Directory-2
 --------File1
 --------Sub-Directory-22019.zip
下面是我从上一个问题得到的批处理文件解决方案。它将每个子目录中的所有文件(忽略我指定的文件夹)压缩到一个zip文件中,该文件的目录名由当前年份附加

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FilesToIgnore=2"
set "theYear=%DATE:~-4%"
set "ListFile=%Temp%\%~n0.lst"
set "Move2=-sdel"      & rem // (set this to `-sdel` if you want the files to be moved into the archive)
set "FoldersToExclude=FoldersToExclude.txt"
del "%ListFile%" 2>nul
REM for /D %%I in (*) do call :CompressFiles "%%I"
for /F "eol=| delims=" %%I in ('dir /AD-H /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /V /X /G:"%FoldersToExclude%"') 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 ...
    echo 7z a %Move2% -bso0 -i"@%ListFile%" -mx5 -scsDOS "%ZipFile%"
    7z a %Move2% -bso0 -i"@%ListFile%" -mx5 -scsDOS "%ZipFile%"
    del "%ListFile%"
)
popd
goto :EOF

:EndBatch
pause
endlocal
我不知道如何修改它来代替压缩指定年份(或上一年)的所有文件。 我相信答案在
dir
命令的第二个
for
循环中。
dir
命令中是否有按日期筛选的方法。
有没有办法将
forfiles
命令与
@fdate
一起使用


谢谢您的帮助。

如果在任何目录中执行
dir/A-D/O-D/TW
会导致在第一列中打印日期格式为
dd.MM.yyyy
的文件名,在第二列中打印时间,在第三列中打印文件大小,在最后一列中打印文件名,在('dir/A-D/O-D/TW 2^>nul^中,命令行的第二个
可以替换为/F“eol=| tokens=3*”%%J('dir/A-D/O-D/TW 2^>numl^-%SystemRoot%\System32\findstr.exe/R“^[0123][0123456789][01][0123456789]\.2019^-%SystemRoot%\System32\findstr.exe/I/L/V/X/C:%ZipFile%”)do>%ListFileecho%%K
创建具有文件名的列表文件,最后一次修改日期为2019年
2019年
。否则,正则表达式搜索字符串
^[0123][0123456789]\[01][0123456789]\.2019必须首先根据为运行此批处理文件时使用的帐户配置的地区/国家/地区,将其改编为本地日期格式。
for
~t
)、
dir
for files
都以区域设置相关的方式处理日期/时间,并且没有日期/时间数据类型,所以写一个可靠的脚本是相当困难的;PowerShell支持实时日期/时间值,您是否希望切换?如果没有,@Mofi的评论提供了一个很好的起点……谢谢@aschipfl。你可能是对的,我真的应该改用PowerShell。@Mofi。非常感谢。这似乎对我有用。我必须将正则表达式和
token=3*
更改为
tokens=4*
。对我来说,最后一行更改是('dir/A-D/O-D/TW 2^>num^-%SystemRoot%\System32\findstr.exe/R“^[01][0123456789]\/[0123][0123456789]\/2019^-%SystemRoot%\System32\findstr.exe/I/L/V/X/C:“%ZipFile%”)do>%ListFile%%echo%%K