Создание/извлечение zip файла и перезапись существующих файлов/содержимого

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Я нашел код для создания и извлечения ZIP файлов с помощью PowerShell из этого ответа, но из-за своей низкой репутации я не могу задать вопрос в качестве комментария к этому ответу.

  • Создание. Как перезаписать существующий ZIP файл без участия пользователя?
  • Извлечение - Как перезаписать существующие файлы и папки без вмешательства пользователя? (Предпочтительно, как функция robocopys mir).

Ответ 1

PowerShell имеет встроенные утилиты .zip без необходимости использования методов класса .NET в версии 5 и выше. Аргумент Compress-Archive -Path также принимает тип string[], поэтому вы можете заархивировать несколько папок/файлов в целевую папку.


Архивирование:

Compress-Archive -Path C:\Foo -DestinationPath C:\Foo.zip -CompressionLevel Optimal -Force

Также есть переключатель -Update.

Разархивирования:

Expand-Archive -Path C:\Foo.zip -DestinationPath C:\Foo -Force

Ответ 2

Версии PowerShell до 5 могут выполнять этот сценарий

Спасибо @Ola-M за обновление.

function Unzip($zipfile, $outdir)
{
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    $archive = [System.IO.Compression.ZipFile]::OpenRead($zipfile)
    foreach ($entry in $archive.Entries)
    {
        $entryTargetFilePath = [System.IO.Path]::Combine($outdir, $entry.FullName)
        $entryDir = [System.IO.Path]::GetDirectoryName($entryTargetFilePath)

        #Ensure the directory of the archive entry exists
        if(!(Test-Path $entryDir )){
            New-Item -ItemType Directory -Path $entryDir | Out-Null 
        }

        #If the entry is not a directory entry, then extract entry
        if(!$entryTargetFilePath.EndsWith("\")){
            [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $entryTargetFilePath, $true);
        }
    }
    $archive.Dispose()
}

Unzip -zipfile "$zip" -outdir "$dir"