dos批处理文件根据时间跨度来压缩文件夹

时间:2012-05-14 14:18:52

标签: batch-file zip dos

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

结构如下

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月,当前是可能的)。一个重要的一点是,我想使用1月1日而不是-90天
  2. 然后将包含所有子文件夹和文件的所选文件夹压缩到一个february2012.zip
  3. 删除(现在)压缩文件的原件
  4. 到目前为止,我最好的想法是使用forfiles.exe(只需要一个日期),使用生成的日期(3个月前的第一天并使用旧的修饰符)并创建resultext文件。然后使用resultfile作为7zip.exe的导入,然后以某种方式循环文件并删除文件夹(对于第2部分和第3部分,我还没有工作代码)

    - 更新 -

    目前我正在尝试:

    FORFILES /P H:\Temp\2zip /M O* /D -31.4.2012 /C "cmd /c C:\Program Files (x86)\7-Zip\7z.exe a -t7z H:\temp\x2.zip @path
    

    这似乎有效 - 但速度非常慢(我猜理由是映射驱动器 - > 3小时150MB)

1 个答案:

答案 0 :(得分:0)

使用文件夹的上次修改日期时要小心。在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命令。