PowerShell从zip文件中提取17个文件夹深

时间:2017-04-07 05:49:36

标签: powershell powershell-v4.0 powershell-v5.0

我有一个自动创建的zip文件,但我无法更改其中的文件夹数量。

我正在尝试从zip文件中深度为17个文件夹的文件夹中提取所有内容。问题是文件夹的名称可能会改变。

我开始使用7Zip来提取另一个zip文件夹,并且工作正常:

$zipExe = join-path ${env:ProgramFiles(x86)} '7-zip\7z.exe'
if (-not (test-path $zipExe)) {
    $zipExe = join-path ${env:ProgramW6432} '7-zip\7z.exe'
    if (-not (test-path $zipExe)) {
         '7-zip does not exist on this system.'
    }
}
set-alias zip "C:\Program Files\7-Zip\7z.exe"
zip x $WebDeployFolder -o \$WebDeployTempFolder 

有没有办法解压缩zip文件中17个文件夹的文件夹中的内容?

1 个答案:

答案 0 :(得分:1)

您可以使用7Zip的列表功能来获取文件的内容。然后,您可以解析该输出,查找具有17个级别的文件夹,并使用该路径提取内容。

下面是一大堆代码就是这样做的。

$7zip = "${env:ProgramFiles(x86)}\7-Zip\7z.exe"
$archiveFile = "C:\Temp\Archive.zip"
$extractPath = "C:\Temp"
$archiveLevel = 17

# Get contents list from zip file
$zipContents = & $7zip l $archiveFile

# Filter contents for only folders, described as "D" in Attr column
$contents = $zipContents | Where-Object { $_ -match "\sD(\.|[A-Z]){4}\s"}

# Get line where the folder level defined in $archiveLevel is present
$folderLine = $contents | Where-Object { ($_ -split "\\").Count -eq ($archiveLevel) }

# Get the folder path from line
$folderPath = $folderLine -split "\s" | Where-Object { $_ } | Select-Object -Last 1

# Extract the folder to the desired path. This includes the entire folder tree but only the contents of the desired folder level
Start-Process $7zip -ArgumentList "x $archiveFile","-o$extractPath","$folderPath" -Wait

# Move the contents of the desired level to the top of the path
Move-Item (Join-Path $extractPath $folderPath) -Destination $extractPath

# Remove the remaining empty folder tree
Remove-Item (Join-Path $extractPath ($folderPath -split "\\" | Select-Object -First 1)) -Recurse

代码中有几点需要注意。 我找不到一种方法来提取没有完整路径/ parensts的文件夹。所以最终清理干净了。但请注意,父文件夹不包含任何其他文件或文件夹。 另外,我不得不在结尾处使用“Start-Process”,否则7Zip会破坏变量输入。

根据您的ZIP文件结构,您可能需要进行一些更改,但它应该可以帮助您。