【问题标题】:Batch-compressing/archiving files within subcategories (files have to be in the root)子类别中的批量压缩/归档文件(文件必须在根目录中)
【发布时间】:2013-04-02 17:48:08
【问题描述】:

我一直在寻找一段时间,将不同目录中的大量照片归档到单独的 zip 存档中。到目前为止没有运气。怎么会?我有一些具体要求;

目录结构:

YEAR => 类别(12 个目录,每年相同)=> 每个类别都有自己的活动 => 每个活动都有自己的图片。例如:

2013\

--------Category1\

--------Category2\

--------Category3\

-----------子类别1\

--------Category4\

--------Category5\

--------Category6\

-----------子类别1\

-----------子类别2\

------------------------------------------Photograph1.jpg

------------------------------------------Photograph2.jpg

--------Category7\

等等……

年份:7 个目录 每个年份文件夹中的子类别:12 每个子类别文件夹中的子类别:100-200 所有文件夹中的照片:70GB,不知道具体有多少文件。

我的问题

我想为每个子类别创建单独的 zip 存档。这是问题所在: zip 档案必须满足 2 个请求:

1) 照片必须放在压缩包的根目录下。当您打开 zip 存档时,您首先要看到的是照片。没有(子)目录。

2) 如果可能,每个 zip 档案的文件大小必须限制为 150mb。因此,即使子类别包含 200mb 的照片,脚本/参数也必须对文件大小设置限制。不仅仅是“拆分”一个 200mb 的 zip-archives,而是真正制作 2 个单独的 zip-archives。一个大小为 150mb,另一个大小为 50mb。

这可能吗?有很多方法可以通过脚本来归档文件,我确实尝试了一些,但它们似乎都没有按照我希望的方式工作;-)

所以...除了照片之外,zip-archives 必须放在同一个子类别中,每个不能超过 150mb,并且必须了解必须压缩哪些文件(子目录的内容)年份类别中的子类别中的类别)。

谢谢! :)

【问题讨论】:

  • 有趣的工作。而且它们的大小不能超过 150 MiB?
  • 好吧,事情就是这样。我有大约 70GB 的照片,需要将它们导入我网站上的照片库系统。该系统有几个限制。其中之一是:您可以导入 zip 存档(包括照片),但我的服务器在上传文件时有一些限制。我已经设法将大小从 2MB 增加到 150MB,但是系统在比这更大的 zip-archives 上崩溃:)
  • 在 WinRar 中你可以在命令行中指定压缩包的大小:)
  • 我试过WinRAR,但系统有另一个限制:上传/导入的zip-archives只能包含根目录下的照片。根目录下没有目录。这就是 WinRAR 所做的。将图片放在根目录下。
  • WinRar 使用x 命令创建文件夹:rar x myarchive

标签: parameters batch-file zip archive subdirectory


【解决方案1】:

给你。使用 .vbs 扩展名保存它。我还没有彻底测试它,但我认为它应该可以工作。对于每个包含文件的目录,它会将这些文件压缩到同一包含目录中的存档中。

哦,欢迎来到 SO!由于您是新手,您可能需要查看this link

' archive_limit.vbs
' usage: cscript archive_limit.vbs (directory, optional)
' If directory is not supplied, traverse subdirectories of current

on error resume next
if WSH.arguments.count = 0 then
    dir = left(WSH.ScriptFullName,(Len(WSH.ScriptFullName))-(len(WSH.ScriptName)))
else
    dir = WSH.arguments(0)
    if not Right(dir, 1) = "\" then
        dir = dir & "\"
    end if
end if

set fso = createobject("scripting.filesystemobject")
set shl = createobject("shell.application")

EnumFolders(fso.GetFolder(dir))

WSH.Quit 0

Sub EnumFolders(fFolder)
    Set objFolder = fso.GetFolder(fFolder.Path)
    Set colFiles = objFolder.Files
    zipnum = 1
    For Each objFile in colFiles
        zipfile = fFolder.Path & "\archive" & zipnum & ".zip"

        If fso.FileExists(zipfile) Then
            projected = fso.GetFile(zipfile).Size + objFile.Size
            if projected >= 157286400 Then
                zipnum = zipnum + 1
                zipfile = fFolder.Path & "\archive" & zipnum & ".zip"
            End If
        End If

        if not fso.FileExists(zipfile) Then
            set zip = fso.createtextfile(zipfile)
            zip.write "PK" & chr(5) & chr(6) & string(18, chr(0))
            zip.close
        End If

        If Not LCase(fso.GetExtensionName(objFile.name)) = "zip" Then
            ' uncomment the following line to log progress to the console
            ' WSH.Echo "Zipping " & fFolder.Path & "\" & objFile.name & " to " & zipfile
            zipitems = shl.namespace(zipfile).items.count
            shl.namespace(zipfile).copyhere(fFolder.Path & "\" & objFile.name)
            do until shl.namespace(zipfile).items.count > zipitems
                WSH.Sleep 100
            loop
        End If

    Next

    For Each Subfolder in fFolder.SubFolders
        EnumFolders(Subfolder)
    Next
End Sub

【讨论】:

  • rojo,你是一个生命安全者! :) 到目前为止非常感谢!以下是我注意到的一些事情: - 每次处理/读取/压缩 jpg 文件时,vbs 都会显示一条消息。
  • Windows Script Host Zipping 我必须(每次)按 OK 才能摆脱它。此外,该脚本不接受带有特殊字符的文件名(它会崩溃)。假设字母:ç 它也崩溃给我这个错误:行:44 字符:13 错误:所需对象:'shl.namespace(...)' 代码:800A01A8 来源:运行时错误 Microsoft VBScript 非常感谢你到目前为止的帮助! :)(我的意思是拼写救生员);-)
  • 对于暂停,不要双击脚本来启动它,而是在 cmd 提示符下使用 cscript 启动它。要么,要么删除 wsh.echo 行。我不确定对带有扩展 Unicode 字符的文件名有什么建议。也许确保 vbs 文件保存为 Unicode 或使用适当的代码页?这可能值得作为一个单独的问题发布。
  • 我删除了 Echo 行。成功了 :) 为了测试脚本,我创建了几个带有一些图像的测试目录。一个目录现在有 155MB 的照片。我删除了所有带有特殊字符的照片(下划线除外,这些似乎适用于只有一张照片的文件夹)。它仍然在某个点崩溃,并出现与以前相同的错误: Line: 44 |字符:13 |错误:需要对象:'shl.namespace(...)' |代码:800A01A8 |来源:运行时错误 Microsoft VBScript
  • ... 或者尝试用三引号将文件路径和名称变量括起来。我现在不在电脑前,所以我无法测试我的理论。如果你需要的话,我明天试试。
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2011-01-25
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多