批量解压子目录中的所有 zip 档案;将每个档案的内容提取到以该档案命名的新目录中

批量解压子目录中的所有 zip 档案;将每个档案的内容提取到以该档案命名的新目录中

我有一个文件夹,里面有大量子文件夹,这些子文件夹中有压缩文件。

我想知道如何将这些文件解压到以 zip 文件命名的文件夹中,例如:

C:\Archives\Photos\A.zip
C:\Archives\Videos\B.zip
C:\Archives\Documents\C.zip

会变成

C:\Archives\Photos\A\
C:\Archives\Videos\B\
C:\Archives\Documents\C\

我目前可以做到这一点,但前提是一次只对一个文件夹进行操作,我想知道是否有办法一次性完成所有操作,我正在考虑一个 .bat 文件。

答案1

@Echo off
For %%F in (Photos,Videos,Documents) Do (
    For /F "delims=" %%Z in ('Dir /B/S/A-D "C:\Archives\%%F\*.zip" 2^>Nul') Do (
        7z x "%%~fZ" -o"%%~dpnZ\" && Rem Del "%%~fZ"
    )
)

如果您想在成功解压后丢弃 zip 文件,请删除Remdel 前面的。

批次使用对于变量 ~ 修饰符仅使用完整文件名的一部分

答案2

PowerShell 单行命令可实现此目的:

Get-ChildItem -Filter *.zip -Recurse C:\Archives | % { $_.FullName } | Split-Path | Get-Unique | % { cd $_ ; &'C:\Program Files\7-Zip\7z.exe' x *.zip -o* }

以下是每个部分的解释,这些解释将传递到下一部分,并按顺序由 Powershell 执行:

  • 获取子项-筛选器 *.zip -Recurse C:\Archives:查找 C:\Archives 下的所有 zip 文件
  • % { $_.全名 }:foreach 结果对象,显示完整路径和名称
  • 分割路径:仅显示每个 zip 的路径(而不是文件名)
  • 获取唯一值:从该列表中删除重复项
  • % { cd $_ ; &'C:\Program Files\7-Zip\7z.exe' x *.zip -o* }:最后,使用创建的列表切换到找到的每个目录;使用 7z.exe 解压每个目录中找到的所有 zip 文件,使用 -o* 参数将每个 zip 文件的内容解压到与该 zip 文件同名的目录中

假设:

  • C:\Archives 是存储所有 zip 文件的目录
  • 您的 7-Zip 安装在默认位置

在研究这个问题时,我得出结论:我更喜欢 bash 而不是 PowerShell :-)

相关内容