PowerShell从zip中提取文件夹内容

PowerShell从zip中提取文件夹内容,powershell,Powershell,我有多个文件夹,比如说它们是Folder1、Folder2、Folder3等等。每个文件夹中都有.zip文件,名称与文件夹名称类似。所以Folder1.zip、Folder2.zip、Folder3.zip等等。在每个zip中都有路径像Content/1/a/5/t/ZIPNAME/a/b/c/temp。路径相同,只是ZIPNAME是当前正在迭代的ziptemp文件夹包含我需要复制到新创建的文件夹中的文件,如.zip名称。我怎样才能做到 这就是我现在得到的。迭代每个文件夹,获取压缩文件并打开它。

我有多个文件夹,比如说它们是
Folder1、Folder2、Folder3等等。
每个文件夹中都有
.zip
文件,名称与文件夹名称类似。所以
Folder1.zip、Folder2.zip、Folder3.zip等等。
在每个zip中都有
路径
Content/1/a/5/t/ZIPNAME/a/b/c/temp
。路径相同,只是
ZIPNAME
是当前正在迭代的zip
temp
文件夹包含我需要复制到新创建的文件夹中的文件,如
.zip
名称。我怎样才能做到

这就是我现在得到的。迭代每个文件夹,获取压缩文件并打开它。如何从zip文件中获取内容并将其复制到新文件夹

    Set-Location -Path $(BaseDeployPath)
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    Get-ChildItem -Recurse -Directory | ForEach-Object {
          $zipPath = Get-ChildItem $_.FullName -Filter *.zip
          $zip = [System.IO.Compression.ZipFile]::OpenRead($zipPath)

          $contentPath = ???

          $zip.Entries | Get-Content $contentPath
    }

    # close ZIP file
    $zip.Dispose()
}

请看一下文档。该方法返回一个对象,其属性包含一组对象。这些对象(除其他外)具有一个属性
FullName
,该属性具有存档中项目的相对路径,因此您应该能够选择要处理的文件,如下所示:

$temp = 'Content/1/a/5/t/ZIPNAME/a/b/c/temp/'

$zip = [IO.Compression.ZipFile]::OpenRead($zipPath)
$entries = $zip.Entries | Where-Object { $_.FullName.StartsWith($temp) -and $_.Name }
附加子句
-和$\Name
从结果中排除目录项(其
名称
属性为空)

文档中还列出了一个方法
extractofile()
,该方法假定允许将条目提取到文件中。但是,该方法在我的测试盒上不可用。不确定它是否只是在PowerShell中不可用,或者是否是在较新版本的.Net framework中添加的

不过,您可以使用传统的方式提取文件:

$entries | ForEach-Object {
    $dstPath = Join-Path 'C:\destination\folder' $_.Name

    $src = $_.Open()
    $dst = New-Object IO.FileStream $dstPath, 'Create', 'Write', 'Read'
    $src.CopyTo($dst)
    $src.Close(); $src.Dispose()
    $dst.Close(); $dst.Dispose()
}