Создание/извлечение 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"