Powershell解压缩文件

时间:2016-05-24 10:13:07

标签: powershell jenkins powershell-v2.0 powershell-v3.0

我使用下面的脚本来解压缩文件。但是解压后我看到我的文件位于“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())

1 个答案:

答案 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)