Как распаковать файл в 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 по-прежнему пуст.

Ответ 1

Вот простой способ использования ExtractToDirectory из System.IO.Compression.ZipFile:

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 создаст ее. Другие предостережения:

  • Существующие файлы не будут перезаписаны, а вызовут исключение IOException.
  • Для этого метода требуется как минимум .NET Framework 4.5, доступная для Windows Vista и новее.
  • Относительные пути не разрешаются в зависимости от текущего рабочего каталога, см. Почему в PowerShell объекты .NET не используют текущий каталог?

Смотрите также:

Ответ 2

В PowerShell v5+ есть команда Expand-Archive (а также Compress-Archive), встроенная в:

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

Ответ 3

В PowerShell v5.1 это немного отличается от v5. Согласно документации MS, он должен иметь параметр -Path для указания пути к архивному файлу.

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

Или это может быть фактический путь:

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

Развернуть-Архив Док

Ответ 4

Эй, он работает для меня..

$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)
}

Ответ 5

Используйте командлет Expand-Archive с одним из набора параметров:

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

Ответ 6

Использование expand-archive, но автоматически создающих каталогов, названных в честь архива:

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

Ответ 7

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'

Ответ 8

Для тех, кто хочет использовать 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)

Ограничения использования Shell.Application на версиях ядра Windows:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core

В основных версиях Windows по умолчанию Microsoft-Windows-Server-Shell-Package не установлен, поэтому shell.applicaton не будет работать.

примечание: извлечение архивов таким способом займет много времени и может замедлить работу графического интерфейса Windows.