我有多个文件夹,假设它们是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()
}
答案 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()
}