如何使用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
    }
}