我使用下面的脚本来解压缩文件。但是解压后我看到我的文件位于“D:\ Packages \ Content \ C_C \ Jenkins \ workspace \ Call \ _ obj \ Release \ Package \ PackageTmp”文件夹下。我应该如何修剪文件夹并直接在“D:\ Packages”文件夹下查看真实内容
# Unzip the file to specified location
$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace($file)
$destination = $shell_app.namespace("D:\Packages")
$destination.Copyhere($zip_file.items())
答案 0 :(得分:0)
您需要遍历zip存档中的嵌套文件夹结构并单独提取每个文件。递归函数是执行此类操作的常用方法。像这样(未经测试):
function Expand-Files($Folder, $Target) {
$Folder.Items() | ForEach-Object {
if ($_.IsFolder) {
Expand-Files $_ $Target
} else {
$Target.CopyHere($_)
}
}
}
Expand-Files $zip_file $destination
请注意CopyHere
异步运行,即调用立即返回,而实际的复制操作可能仍在后台运行。
您还可以将嵌套文件夹树提取到临时目录,然后将所有文件复制到实际目标文件夹:
Get-ChildItem $destination -Recurse |
Where-Object { -not $_.PSIsContainer } |
Move-Item -Destination $actualDestination
使用该方法(安装了.NET Framework 4.5或更新版本),您可能会抛弃笨拙/片状的CopyHere
方法并改为使用ExtractToDirectory
:
Add-Type -Assembly System.IO.Compression.FileSystem
$zipfile = 'C:\path\to\your.zip'
$tempdir = "$env:TEMP\some\folder"
$destination = 'D:\Packages'
[IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $tempdir)
Get-ChildItem $tempdir -Recurse |
Where-Object { -not $_.PSIsContainer } |
Move-Item -Destination $destination
Remove-Item $tempdir -Recurse -Force
或者,您只需使用7-zip:
& 7z.exe e -o"$destination" "$zipfile"
从命令帮助(强调我的):
7-Zip [32] 16.00:Copyright(c)1999-2016 Igor Pavlov:2016-05-10
用法:7z< command> [< switches> ...]< archive_name> [< file_names> ...] [< @listfiles ...>]
<命令>
a:将文件添加到存档中 b:基准
d:从档案中删除文件
e:从存档中提取文件(不使用目录名称)
h:计算文件的哈希值
i:显示有关支持的格式的信息
l:列出档案的内容
:重命名存档中的文件
t:测试档案的完整性
u:更新要存档的文件
x:具有完整路径的eXtract文件
...
其他包装工可能有类似的选择。
编辑:如果您只想从zip存档中的特定子文件夹中提取内容,可以将路径(包括嵌套路径)传递给Namespace
方法:
$app = New-Object -COM 'Shell.Application'
$items = $app.NameSpace('C:\path\to\your.zip\folder\inside\archive').Items()
$app.NameSpace('D:\Packages').CopyHere($items)