如何在Powershell中解压缩文件?

时间:2015-01-04 17:31:12

标签: powershell

我有一个.zip文件,需要使用Powershell解压缩整个内容。我这样做但它似乎不起作用:

$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\a.zip")
MkDir("C:\a")
foreach ($item in $zip.items()) {
  $shell.Namespace("C:\a").CopyHere($item)
}

出了什么问题?目录C:\a仍为空。

10 个答案:

答案 0 :(得分:426)

在PowerShell v5 +中,内置了Expand-Archive command(以及Compress-Archive):

Expand-Archive c:\a.zip -DestinationPath c:\a

答案 1 :(得分:214)

以下是使用System.IO.Compression.ZipFile中的ExtractToDirectory的简单方法:

Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
    param([string]$zipfile, [string]$outpath)

    [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}

Unzip "C:\a.zip" "C:\a"

请注意,如果目标文件夹不存在,ExtractToDirectory将创建它。

How to Compress and Extract files

答案 2 :(得分:22)

在PowerShell v5.1中,与v5相比略有不同。根据MS文档,它必须具有-Path参数来指定存档文件路径。

Expand-Archive -Path Draft.Zip -DestinationPath C:\Reference

否则,这可能是一条实际路径:

Expand-Archive -Path c:\Download\Draft.Zip -DestinationPath C:\Reference

Expand-Archive Doc

答案 3 :(得分:11)

嘿它为我工作..

$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("put ur zip file path here")
foreach ($item in $zip.items()) {
  $shell.Namespace("destination where files need to unzip").CopyHere($item)
}

答案 4 :(得分:2)

使用expand-archive但自动创建以存档命名的目录:

function unzip ($file) {
    $dirname = (Get-Item $file).Basename
    New-Item -Force -ItemType directory -Path $dirname
    expand-archive $file -OutputPath $dirname -ShowProgress
}

答案 5 :(得分:1)

function unzip {
    param (
        [string]$archiveFilePath,
        [string]$destinationPath
    )

    if ($archiveFilePath -notlike '?:\*') {
        $archiveFilePath = [System.IO.Path]::Combine($PWD, $archiveFilePath)
    }

    if ($destinationPath -notlike '?:\*') {
        $destinationPath = [System.IO.Path]::Combine($PWD, $destinationPath)
    }

    Add-Type -AssemblyName System.IO.Compression
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    $archiveFile = [System.IO.File]::Open($archiveFilePath, [System.IO.FileMode]::Open)
    $archive = [System.IO.Compression.ZipArchive]::new($archiveFile)

    if (Test-Path $destinationPath) {
        foreach ($item in $archive.Entries) {
            $destinationItemPath = [System.IO.Path]::Combine($destinationPath, $item.FullName)

            if ($destinationItemPath -like '*/') {
                New-Item $destinationItemPath -Force -ItemType Directory > $null
            } else {
                New-Item $destinationItemPath -Force -ItemType File > $null

                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($item, $destinationItemPath, $true)
            }
        }
    } else {
        [System.IO.Compression.ZipFileExtensions]::ExtractToDirectory($archive, $destinationPath)
    }
}

使用:

unzip 'Applications\Site.zip' 'C:\inetpub\wwwroot\Site'

答案 6 :(得分:1)

ForEach循环处理位于$filepath变量内的每个ZIP文件

    foreach($file in $filepath)
    {
        $zip = $shell.NameSpace($file.FullName)
        foreach($item in $zip.items())
        {
            $shell.Namespace($file.DirectoryName).copyhere($item)
        }
        Remove-Item $file.FullName
    }

答案 7 :(得分:0)

对于那些想使用 Shell.Application.Namespace.Folder.CopyHere()并希望在复制时隐藏进度条或使用更多选项的用户,文档在这里:
https://docs.microsoft.com/en-us/windows/desktop/shell/folder-copyhere

要使用Powershell并隐藏进度条并禁用确认,可以使用如下代码:

# We should create folder before using it for shell operations as it is required
New-Item -ItemType directory -Path "C:\destinationDir" -Force

$shell = New-Object -ComObject Shell.Application
$zip = $shell.Namespace("C:\archive.zip")
$items = $zip.items()
$shell.Namespace("C:\destinationDir").CopyHere($items, 1556)

在Windows核心版本上使用Shell.Application的限制:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core

在Windows 核心版本中,默认情况下未安装 Microsoft-Windows-Server-Shell-Package ,因此shell.applicaton将不起作用。

注释 :以这种方式提取档案将花费很长时间,并且会降低Windows gui的速度

答案 8 :(得分:0)

对参数集之一使用Expand-Archive cmdlet:

Expand-Archive -LiteralPath C:\source\file.Zip -DestinationPath C:\destination
Expand-Archive -Path file.Zip -DestinationPath C:\destination

答案 9 :(得分:0)

使用内置的 powershell 方法 Expand-Archive

示例

Expand-Archive -LiteralPath C:\archive.zip -DestinationPath C:\