2017-04-07 88 views
1

我有一個自動創建的zip文件,我無法更改其中的文件夾數量。PowerShell從zip文件中提取17個文件夾深

我試圖提取所有從深17個文件夾中的zip文件中的文件夾中的內容。問題是文件夾的名稱可能會更改。

我開始使用7Zip解壓縮其他壓縮文件夾和正常工作:

$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 

有沒有一種方法來提取深17個文件夾中的ZIP文件中的文件夾中的內容?

+0

我丟失的問題,或者你所面臨的問題:您可以編輯您的問題,所以它明確規定,你所面臨的問題? – bluuf

+0

@bluuf完成。添加所以我的問題是:有沒有辦法提取zip文件中17個文件夾深處的文件夾中的內容。 –

+0

@bluuf我的答案是:是的。請澄清你的問題。具體問題是什麼?你是否嘗試過自己?請在幫助中心查看[我如何提出一個好問題?](https://stackoverflow.com/help/how-to-ask)。 – Clijsters

回答

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文件結構都有點,但它應該讓你去。

+0

這工作到它移動項目(加入路徑$ extractPath $ folderPath)-Destination $ extractPath我得到一個無效路徑錯誤,但路徑是正確的。 –

+0

我在本地做了一個人工測試,它對我很有用,但是在你的環境中可能會有一些差異。你是否記得更新頂部的路徑?你能提供確切的錯誤信息嗎? –

+0

是的,我已經改變了路徑,我應該添加這些是網絡路徑。 錯誤: 無效路徑:無效路徑:「\\計算機\共享\ GDistribute \測試\ QA \ WebsiteName \ CodeName.Web \內容\ R_C \ GO47_1 \ DATA01 \ 2 \代號\ BuildName \源頭\ SRC \ DIR \ 31X \來源\ CodeName.Web \ OBJ \發佈\包\ PackageTmp」。 在行:22字符:1 +移動項目(聯接路徑$ extractPath $ FOLDERPATH)-Destination $ extractPath + CategoryInfo:InvalidOperation:(:) [],ArgumentException的 + FullyQualifiedErrorId:MoveItemDynamicParametersProviderException –

相關問題