[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理如何从含多层嵌套文件夹的zip中解出有具体文件名不知具体位置的文件

本帖最后由 lforl 于 2024-5-30 10:18 编辑

有个体积很大的zip(如名叫big.zip)含有多层嵌套文件夹,想从此zip中一解压出一个知道文件名的文件(如名叫abc.txt),单文件处于那一层嵌套文件夹位置未知,命令行该怎么写?期待大佬指点。

试试
7z x big.zip abc.txt -r

TOP

ExtractFile.vbs
  1. strZipPath = "R:\big.zip"
  2. strExtractFileName = "abc.txt"
  3. Set objShell = CreateObject("Shell.Application")
  4. Set objFso = CreateObject("Scripting.FileSystemObject")
  5. Set objFolder = objShell.NameSpace(strZipPath)
  6. If Not objFolder Is Nothing Then
  7.     Dim fileIndex
  8.     fileIndex = 0
  9.     Call RecurseZip(objFolder, "", fileIndex, strExtractFileName)
  10. Else
  11.     WScript.Echo "Cannot find or open the zip file."
  12. End If
  13. Sub RecurseZip(objFolder, strPath, ByRef fileIndex, strFileName)
  14.     For Each objItem in objFolder.Items
  15.         strCurrentPath = strPath & objItem.Name
  16.         If objItem.IsFolder Then
  17.             Call RecurseZip(objShell.NameSpace(objItem.Path), strCurrentPath & "\", fileIndex, strFileName)
  18.         Else
  19.             If objItem.Name = strFileName Then
  20.                 strDestPath = currentPath & Replace(strFileName, ".", "_" & fileIndex & ".")
  21.                 objShell.NameSpace(objFso.GetAbsolutePathName(".")).CopyHere objItem
  22.                 Do Until objFso.FileExists(objFso.GetAbsolutePathName(".")& "\" & strFileName)
  23.                     WScript.Sleep 100
  24.                 Loop
  25.                 objFso.MoveFile objFso.GetAbsolutePathName(".") & "\" & objItem.Name, strDestPath
  26.                 WScript.Echo "Extracted: " & strCurrentPath & " to " & strDestPath
  27.                 fileIndex = fileIndex + 1
  28.             End If
  29.         End If
  30.     Next
  31. End Sub
复制代码
1

评分人数

    • lforl: 多谢大佬。这个略显繁复。学习了!技术 + 1

TOP

本帖最后由 lforl 于 2024-5-29 21:35 编辑
试试
7z x big.zip abc.txt -r
Five66 发表于 2024-5-29 19:01


很妙,-r一个参数搞定,简洁明了,高效!

使用了-r参数,得到的是文件夹,内部存放了我要解压的文件。
不知能否做到:
1.递归找到文件并释出后,就终止7z和控制台。因为zip文件挺大,不想让他继续往下查,而占用资源。
是否必要,因为我感觉8G的zip似乎也是几十秒出结果。(48G内存,i9 cpu)

2.解压结果只要文件释出,而不出现那些文件夹吗?比如我要那个文件直接放在bat所在目录中。

TOP

回复 4# lforl


   
1应该是要一直查才知道符不符合吧,不知道,大概不行
2的话用可以e选项解压,不过因为名字相同,还得加上-aot或-aou选项来自动重命名,不过最好还得加上-o选项来指定输出文件夹,例如:7z e -aot -obig big.zip abc.txt -r

TOP

回复 4# lforl


    abc.txt如果在zip里面有多个怎么办?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5# Five66

多谢大佬指点。学会了。
我小结一下,以便于后来人。
REM 注释:7z e 从压缩档案中释放文件到当前目录中。或者到指定的输出文件夹(如 -o c:\Doc)。
REM 注释:7z x 在当前目录中,使用完整路径从压缩档案中释放文件.或者到指定的输出文件夹。
REM 注释:-r 表示递归子目录,遍历所有文件夹和文件


回大版 @Batcher:因为此大包是我打包的,比较确定是没有重复文件,追求效率。如果的确默认7z保持原来文件路径是比较好的方法。

TOP

返回列表