![批量解压子目录中的所有 zip 档案;将每个档案的内容提取到以该档案命名的新目录中](https://linux22.com/image/1539327/%E6%89%B9%E9%87%8F%E8%A7%A3%E5%8E%8B%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%20zip%20%E6%A1%A3%E6%A1%88%EF%BC%9B%E5%B0%86%E6%AF%8F%E4%B8%AA%E6%A1%A3%E6%A1%88%E7%9A%84%E5%86%85%E5%AE%B9%E6%8F%90%E5%8F%96%E5%88%B0%E4%BB%A5%E8%AF%A5%E6%A1%A3%E6%A1%88%E5%91%BD%E5%90%8D%E7%9A%84%E6%96%B0%E7%9B%AE%E5%BD%95%E4%B8%AD.png)
我有一个文件夹,里面有大量子文件夹,这些子文件夹中有压缩文件。
我想知道如何将这些文件解压到以 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 文件,请删除Rem
del 前面的。
批次使用对于变量 ~ 修饰符仅使用完整文件名的一部分
答案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 :-)