我有一个文件夹,里面有大量子文件夹,这些子文件夹中有压缩文件。
我想知道如何将这些文件解压到以 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 :-)