如何使用powershell提取同一文件夹中子文件夹中的所有zip文件
How to extract all zip files in subfolders in same folder using powershell
我有一个这样的嵌套文件夹结构(为了简单起见,我举了一个例子)
- folder1
- folderA
a.zip
- folderB
b.zip
我想解压缩同一文件夹中的所有 zip 文件并删除原始 zip 文件。
所以我的预期输出就像
- folder1
- folderA
- a
files in a.zip
- folderB
- b
files in b.zip
我可以通过 Get-ChildItem '.' -R -Filter *.zip
命令获取所有 zip 文件的列表
然后我也可以通过管道将其解压缩
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath c:\a
给出了固定的目标路径
我也可以通过
获取每个 zip 文件的文件夹名称
Get-ChildItem '.' -R -Filter *.zip | select -ExpandProperty DirectoryName
我也试过了
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath $_.DirectoryName
and
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath %{$_.DirectoryName}
also
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath {$_.DirectoryName}
但我找不到将 DirectoryName 传递给 Expand-Archive 命令的方法
我找到了解决方案以防其他人遇到同样的问题
Get-ChildItem '.' -R -Filter *.zip | ForEach-Object {
Expand-Archive $_.FullName "$($_.DirectoryName)/$($_.Basename)" -Force
Remove-Item $_.FullName
}
可以调用Get-ChildItem
输出的FileInfo
对象的Directory
属性得到这些文件的父文件夹的DirectoryInfo
对象,那么就可以调用父类的FullName
属性获取目标文件夹
理论上,这可以使用 -PipelineVariable
而不是 ForEach-Object
循环,但我还没有亲自测试过。
$ErrorActionPreference = 'Stop'
Get-ChildItem '.' -R -Filter *.zip | ForEach-Object {
try {
Expand-Archive -LiteralPath $_.FullName -DestinationPath $_.Directory.FullName -Force
Remove-Item -LiteralPath $_.FullName
}
catch {
Write-Warning $_.Exception.Message
}
}
我有一个这样的嵌套文件夹结构(为了简单起见,我举了一个例子)
- folder1
- folderA
a.zip
- folderB
b.zip
我想解压缩同一文件夹中的所有 zip 文件并删除原始 zip 文件。
所以我的预期输出就像
- folder1
- folderA
- a
files in a.zip
- folderB
- b
files in b.zip
我可以通过 Get-ChildItem '.' -R -Filter *.zip
命令获取所有 zip 文件的列表
然后我也可以通过管道将其解压缩
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath c:\a
给出了固定的目标路径 我也可以通过
获取每个 zip 文件的文件夹名称 Get-ChildItem '.' -R -Filter *.zip | select -ExpandProperty DirectoryName
我也试过了
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath $_.DirectoryName
and
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath %{$_.DirectoryName}
also
Get-ChildItem '.' -R -Filter *.zip | Expand-Archive -Force -DestinationPath {$_.DirectoryName}
但我找不到将 DirectoryName 传递给 Expand-Archive 命令的方法
我找到了解决方案以防其他人遇到同样的问题
Get-ChildItem '.' -R -Filter *.zip | ForEach-Object {
Expand-Archive $_.FullName "$($_.DirectoryName)/$($_.Basename)" -Force
Remove-Item $_.FullName
}
可以调用Get-ChildItem
输出的FileInfo
对象的Directory
属性得到这些文件的父文件夹的DirectoryInfo
对象,那么就可以调用父类的FullName
属性获取目标文件夹
理论上,这可以使用 -PipelineVariable
而不是 ForEach-Object
循环,但我还没有亲自测试过。
$ErrorActionPreference = 'Stop'
Get-ChildItem '.' -R -Filter *.zip | ForEach-Object {
try {
Expand-Archive -LiteralPath $_.FullName -DestinationPath $_.Directory.FullName -Force
Remove-Item -LiteralPath $_.FullName
}
catch {
Write-Warning $_.Exception.Message
}
}