DOS 批处理文件到基于时间跨度的 zip 文件夹



我正在寻找一种方法,可以根据上次修改日期的时间跨度压缩文件夹,然后删除它们

结构如下

Folder_1 01.01.2012 12:00
- sub1
- sub2
  - file1
  - file2
Folder_2 01.01.2012 12:02
...
Folder_20202 05.05.2012 03:00

我现在想要:

  1. 选择比本月早 3 个月的所有文件夹(例如,上次修改时间为 2 月,而当前为 5 月(。一个重要的点是我想使用每月 1 日到最后一个月而不是 -90 天
  2. 然后将包含所有子文件夹和文件的所有子文件夹和文件压缩到一个 2012 年 2 月.zip
  3. 删除(现在(压缩文件的原始文件

到目前为止,我最好的主意是使用 forfiles.exe(只需要一个日期(,使用生成的日期(3 个月前的第一天并使用 Old Than 修饰符(并创建一个 resultextfile。然后使用结果文件作为7zip的导入.exe并以某种方式循环该文件并在之后删除文件夹(对于第2和3部分,我还没有工作代码(

--更新--

目前我正在试验:

FORFILES /P H:Temp2zip /M O* /D -31.4.2012 /C "cmd /c C:Program Files (x86)7-Zip7z.exe a -t7z H:tempx2.zip @path

这似乎有效 - 但非常缓慢(我想原因是映射驱动器 - 3MB> 150h(

使用文件夹的最后修改日期时要小心。在 FAT 文件系统上,当文件夹的内容更改时,时间戳不会更改。

在 NTFS 文件系统上,每当在文件夹中创建或删除文件或文件夹时,都会更新上次修改日期。但是,如果修改了文件,或者在子文件夹中创建或删除了文件/文件夹,则不会更新它。

如果你仍然想推进你的计划,那么你的基本策略是相当可靠的。Windows 批处理对处理日期的支持非常弱,因此没有太大的改进空间。

无论区域设置如何,解析当前日期(如果需要,也可以分析时间(的最佳方法是使用 WMIC:

for /f "skip=1" %%A in ('wmic os get localdatetime') do (
  set currentDateTime=%%A
  goto :exitLoop
)
:exitLoop
set year=%currentDateTime:~0,4%
set month=%currentDateTime:~4,2%

您应该能够使用 7zip 的移动选项,这样之后就不需要删除该文件夹。

您应该能够通过使用 FOR/F 处理 FORFILES 的结果来消除对临时文件的需求。或者更好的是,您可以使用 FORFILES/C 选项指定适当的 7zip 命令。

最新更新