PowerShell从zip提取文件夹内容

时间:2018-11-28 15:33:44

标签: powershell

我有多个文件夹,假设它们是Folder1, Folder2, Folder3, etc.,每个人的内部都有.zip文件,其名称类似于文件夹名称。因此,Folder1.zip, Folder2.zip, Folder3.zip, etc.在每个拉链中都有path,就像Content/1/a/5/t/ZIPNAME/a/b/c/temp。除了ZIPNAME是当前正在迭代的zip以外,其他路径是相同的。 temp文件夹包含我需要复制到新创建的文件夹的文件,例如.zip名称。我该如何实现?

这就是我目前所得到的。遍历每个文件夹,获取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()
}

1 个答案:

答案 0 :(得分:1)

请查看文档。 OpenRead()方法返回一个ZipArchive对象,该对象的Entries属性包含ZipArchiveEntry个对象的集合。这些对象(除其他事项外)具有属性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 }

附加子句-and $_.Name从结果中排除目录条目(具有空的Name属性)。

文档中还列出了方法ExtractToFile(),该方法应该允许将条目提取到文件中。但是,该方法在我的测试箱上不可用。不知道它是否仅在PowerShell中不可用,或者是否已在.Net框架的最新版本中添加。

不过,您可以采用老式方式提取文件

$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()
}