Как создать zip-архив с PowerShell?

244

Можно ли создать zip-архив с помощью PowerShell?

Валентин Васильев
источник
Любой образец с полным исходным кодом?
Kiquenet

Ответы:

124

Если вы зайдете в CodePlex и возьмете расширения сообщества PowerShell , вы можете использовать их write-zipкомандлет.

поскольку

CodePlex находится в режиме только для чтения при подготовке к выключению

Вы можете перейти в галерею PowerShell .

Мэтт Гамильтон
источник
114
Да, и он использует 7z в качестве основной библиотеки для большинства своих командлетов сжатия. Я знаю, потому что я реализовал это;) +1
x0n
1
лол хорошая работа, х0н. Я реализовал провайдера магазина каналов в PSCX. Чуть менее практичным, но тонны веселья. :)
Мэтт Гамильтон
1
Если он использует 7z, возможно ли заархивировать пароль?
Мак
1
@ SemiDementedwrite-zip [input file/folder] [output file]
joshschreuder
9
Powershell 5 поставляется с командлетами Compress-Archive, которые создают .zip blogs.technet.microsoft.com/heyscriptingguy/2015/08/13/…
Бенуа Патра
255

Чистая альтернатива PowerShell, которая работает с PowerShell 3 и .NET 4.5 (если вы можете ее использовать):

function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
        $zipfilename, $compressionLevel, $false)
}

Просто введите полный путь к zip-архиву, который вы хотите создать, и полный путь к каталогу, содержащему файлы, которые вы хотите заархивировать.

petrsnd
источник
1
Для этого нужен Powershell 3.0 или просто .net 4.5? Мне кажется, что в действительности все возможности PowerShell - это просто программирование .net.
bwerks
@bwerks смотрите раздел «редактировать» здесь
noam
Я искал способ просто сжать один большой файл, но, видимо, нет способа для этого. Мне пришлось написать код, который создаст новый каталог, скопировать туда один файл, сжать этот каталог до нового zip-файла, а затем удалить каталог для очистки.
Baodad
1
@ Баодад, посмотри мой ответ.
Дерик,
Должен был прочитать, что мне нужен полный путь. Мальчик это сбивало с толку! Кстати, это должен быть принятый ответ
Каньон Колоб
244

PowerShell v5.0 добавляет Compress-Archiveи Expand-Archiveкомандлеты. На связанных страницах есть полные примеры, но суть этого:

# Create a zip file with the contents of C:\Stuff\
Compress-Archive -Path C:\Stuff -DestinationPath archive.zip

# Add more files to the zip file
# (Existing files in the zip file with the same name are replaced)
Compress-Archive -Path C:\OtherStuff\*.txt -Update -DestinationPath archive.zip

# Extract the zip file to C:\Destination\
Expand-Archive -Path archive.zip -DestinationPath C:\Destination
Брант Бобби
источник
11
PowerShell v5.0 был официально выпущен сейчас. Это также идет с Windows 10.
Охад Шнайдер
Теперь доступно здесь: microsoft.com/en-us/download/details.aspx?id=50395
старлок
2
Из пункта 2 Compress-Archiveописания: «... максимальный размер файла, который вы можете сжать с помощью Compress-Archive, в настоящее время составляет 2 ГБ. Это ограничение базового API». Однако, если вы используете, System.IO.Compression.ZipFileвы можете обойти это ограничение.
AMissico
2
Ограничение в 2 ГБ было унаследовано от System.IO.Compression.ZipFile. Если используемая вами среда .NET не имеет этого ограничения, CmdLet не должен превышать этот предел. Я подтвердил в коде.
TravisEz13
2
@Pramod нет -OutputPathпараметров.
BrainSlugs83
57

Родной путь с новейшей платформой .NET 4.5, но полностью без функциональности:

Создание:

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ;

Экстракция:

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;

Как уже упоминалось, полностью без функций, так что не ожидайте флаг перезаписи .

ОБНОВЛЕНИЕ: см. Ниже для других разработчиков, которые расширили это за эти годы ...

sonjz
источник
Почему вы используете безликий метод?
Плутон
Это должен быть принятый ответ в порядке даты и прецедента. Что касается вашего обновленного комментария - есть действительно огромное количество способов сделать это сейчас. Я столкнулся с необходимостью этой функциональности, и я на PowerShell 4, первое, что я нашел, - это родной путь. Это был хороший вопрос в 2009 году. Я все еще думаю, что в этом вопросе могли быть представлены дальнейшие исследования, когда он был задан изначально.
DtechNet
45

Установите 7zip (или загрузите вместо него версию командной строки) и используйте этот метод PowerShell:

function create-7zip([String] $aDirectory, [String] $aZipfile){
    [string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
    & $pathToZipExe $arguments;
}

Вы можете позвонить так:

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"
Карл Гленнон
источник
6
Если 7zip находится на вашем пути, то все, что вам нужно написать, это «& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip»
aboy021
5
Если вы не хотите его устанавливать, вы можете вместо этого загрузить версию командной строки. (Просто посмотрите на страницу загрузки 7-zip.) Это просто исполняемый файл, и синтаксис команды такой же. Однако исполняемый файл имеет другое имя; это почему-то 7za.exe. Я сделал это на ряде проектов и никогда не разочаровывался.
jpmc26
Я слишком долго пытался использовать инструменты .net и Powershell, пока не пошел путь 7zip, который сработал сразу. Простой цикл foreach на $ file делает & "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
свое дело
17

Лот изменился с момента публикации первоначального ответа. Вот некоторые из последних примеров использования команды Compress-Archive .

Команда для создания нового файла архива, Draft.zipсжимая два файла, Draftdoc.docxи diagram2.vsd, заданная Pathпараметром. Уровень сжатия, указанный для этой операции, является оптимальным.

Compress-Archive -Path C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

Команда для создания нового файла архива, Draft.zipсжимая два файла, Draft doc.docxи Diagram [2].vsd, указанных LiteralPathпараметром. Уровень сжатия, указанный для этой операции, является оптимальным.

Compress-Archive -LiteralPath 'C:\Reference\Draft Doc.docx', 'C:\Reference\Images\Diagram [2].vsd'  -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

Команда для создания нового файла архива Draft.zip, в C:\Archivesпапке. Новый архивный файл содержит каждый файл в папке C: \ Reference , поскольку вместо конкретных имен файлов в параметре Path использовался подстановочный знак .

Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft

Команда создает архив из всей папки, C:\Reference

Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft

PowerShell .zipавтоматически добавляет расширение к имени файла.

Кришна Прасад Ялаварти
источник
15

Отредактируйте два - Этот код - уродливый, уродливый клуг с древних времен. Ты не хочешь этого.

Это сжимает содержимое .\into .\out.zipс System.IO.Packaging.ZipPackage, следуя приведенному здесь примеру

$zipArchive = $pwd.path + "\out.zip"
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive,
  [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
$in = gci .\in | select -expand fullName
[array]$files = $in -replace "C:","" -replace "\\","/"
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   $part=$ZipPackage.CreatePart($partName, "application/zip",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}
$ZipPackage.Close()

Изменить: Ненадежный для больших файлов, может быть> 10 МБ, YMMV. Что-то связанное с доказательствами appdomain и изолированным хранилищем. Более дружественный подход .NET 4.5 прекрасно работает с PS v3, но в моем случае требовалось больше памяти. Чтобы использовать .NET 4 из PS v2, файлы конфигурации нуждаются в неподдерживаемой настройке .

Ноам
источник
Основная проблема ZipPackage заключается в том, что он не является обычным ZIP- файлом, но содержит XML-файл содержимого. см .: [как избежать [Content_Types] .xml в классе .net ZipPackage - Переполнение стека] ( stackoverflow.com/questions/3748970/… )
aaron
@aaron Еще одна веская причина не использовать это снова! У вас жесткая конкуренция за «главную проблему» здесь;)
noam
12

Давая ниже другой вариант. Это заархивирует полную папку и запишет архив по указанному пути с заданным именем.

Требуется .NET 3 или выше

Add-Type -assembly "system.io.compression.filesystem"

$source = 'Source path here'    
$destination = "c:\output\dummy.zip"

If(Test-path $destination) {Remove-item $destination}

[io.compression.zipfile]::CreateFromDirectory($Source, $destination)
Картикеян
источник
10

Вот собственное решение для PowerShell v5, использующее командлет Compress-Archive Создание Zip-файлов с помощью PowerShell .

Смотрите также Документы Microsoft для Compress-Archive .

Пример 1:

Compress-Archive `
    -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
    -CompressionLevel Optimal `
    -DestinationPath C:\Archives\Draft.Zip

Пример 2:

Compress-Archive `
    -Path C:\Reference\* `
    -CompressionLevel Fastest `
    -DestinationPath C:\Archives\Draft

Пример 3:

Write-Output $files | Compress-Archive -DestinationPath $outzipfile
Аарон
источник
7

Для сжатия я бы использовал библиотеку (7-Zip хорош, как предлагает Михал ).

Если вы установите 7-Zip , в установленном каталоге будет находиться 7z.exeконсольное приложение.
Вы можете вызвать его напрямую и использовать любую опцию сжатия, какую захотите.

Если вы хотите взаимодействовать с DLL, это также должно быть возможно.
7-Zip является бесплатным и открытым исходным кодом.

Nik
источник
2
Вот пример использования 7 zip с шифрованием AES от Powershell: codeblog.theg2.net/2010/02/…
Грег Брей,
7

Как насчет System.IO.Packaging.ZipPackage?

Это потребует .NET 3.0 или выше.

#Load some assemblys. (No line break!)
[System.Reflection.Assembly]::Load("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

#Create a zip file named "MyZipFile.zip". (No line break!)
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open("C:\MyZipFile.zip",
   [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")

#The files I want to add to my archive:
$files = @("/Penguins.jpg", "/Lighthouse.jpg")

#For each file you want to add, we must extract the bytes
#and add them to a part of the zip file.
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   #Create each part. (No line break!)
   $part=$ZipPackage.CreatePart($partName, "",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}

#Close the package when we're done.
$ZipPackage.Close()

через Андерса Хессельбома

Питер П.
источник
5

Почему никто не смотрит на документацию ?? Существует поддерживаемый метод создания пустого zip-файла и добавления к нему отдельных файлов, встроенных в ту же библиотеку .NET 4.5, на которую ссылаются все.

Ниже приведен пример кода:

# Load the .NET assembly
Add-Type -Assembly 'System.IO.Compression.FileSystem'

# Must be used for relative file locations with .NET functions instead of Set-Location:
[System.IO.Directory]::SetCurrentDirectory('.\Desktop')

# Create the zip file and open it:
$z = [System.IO.Compression.ZipFile]::Open('z.zip', [System.IO.Compression.ZipArchiveMode]::Create)

# Add a compressed file to the zip file:
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($z, 't.txt', 't.txt')

# Close the file
$z.Dispose()

Я рекомендую вам просмотреть документацию, если у вас есть какие-либо вопросы.

Плутон
источник
2
Спасибо за это, это идеально. Особенно по сравнению с командлетом Compress-Archive, который плохо спроектирован и не имеет хорошего способа указать пути внутри почтового индекса.
Рафаэль Китовер
4

Это действительно неясно, но работает. 7za.exe является автономной версией 7zip и доступна с установочным пакетом.

# get files to be send
$logFiles = Get-ChildItem C:\Logging\*.* -Include *.log | where {$_.Name -match $yesterday} 

foreach ($logFile in $logFiles)
{
    Write-Host ("Processing " + $logFile.FullName)

    # compress file
    & ./7za.exe a -mmt=off ($logFile.FullName + ".7z") $logFile.FullName

}
Михал Шнайдер
источник
4

Если кому-то нужно сжать один файл (а не папку): http://blogs.msdn.com/b/jerrydixon/archive/2014/08/08/zipping-a-single-file-with-powershell.aspx

[CmdletBinding()]
Param(
     [Parameter(Mandatory=$True)]
     [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
     [string]$sourceFile,

     [Parameter(Mandatory=$True)]
     [ValidateScript({-not(Test-Path -Path $_ -PathType Leaf)})]
     [string]$destinationFile
) 

<#
     .SYNOPSIS
     Creates a ZIP file that contains the specified innput file.

     .EXAMPLE
     FileZipper -sourceFile c:\test\inputfile.txt 
                -destinationFile c:\test\outputFile.zip
#> 

function New-Zip
{
     param([string]$zipfilename)
     set-content $zipfilename 
          ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
     (dir $zipfilename).IsReadOnly = $false
}

function Add-Zip
{
     param([string]$zipfilename) 

     if(-not (test-path($zipfilename)))
     {
          set-content $zipfilename 
               ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
          (dir $zipfilename).IsReadOnly = $false    

     }

     $shellApplication = new-object -com shell.application
     $zipPackage = $shellApplication.NameSpace($zipfilename)


     foreach($file in $input) 
     { 
          $zipPackage.CopyHere($file.FullName)
          Start-sleep -milliseconds 500
     }
}

dir $sourceFile | Add-Zip $destinationFile
Dherik
источник
Этот код опирается на приложение-оболочку, а затем угадывает 500 мс, чтобы дождаться его завершения ... Я не согласен с тем, что оно работает (в большинстве случаев). Но он создает всплывающие окна, поскольку вы используете его в каждом случае, когда добавление сжатого файла занимает некоторое время (легко воспроизводится при добавлении больших файлов или работе с большими почтовыми индексами). Также, если какая-либо операция zip выполняется медленнее, чем указано время ожидания, она не сможет добавить файл и оставить всплывающее диалоговое окно. Это ужасно для сценариев. Я также опроверг другой ответ, который опирается на COM-объект, потому что он не устраняет эти ловушки.
Плутон
4

Вот рабочий код, архивирующий все файлы из исходной папки и создающий zip-файл в целевой папке.

    $DestZip="C:\Destination\"
    $Source = "C:\Source\"

    $folder = Get-Item -Path $Source

    $ZipTimestamp = Get-Date -format yyyyMMdd-HHmmss;
    $ZipFileName  = $DestZip + "Backup_" + $folder.name + "_" + $ZipTimestamp + ".zip" 

    $Source

    set-content $ZipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    # Wait for the zip file to be created.
    while (!(Test-Path -PathType leaf -Path $ZipFileName))
    {    
        Start-Sleep -Milliseconds 20
    } 
    $ZipFile = (new-object -com shell.application).NameSpace($ZipFileName)

    Write-Output (">> Waiting Compression : " + $ZipFileName)       

    #BACKUP - COPY
    $ZipFile.CopyHere($Source) 

    $ZipFileName
    # ARCHIVE

    Read-Host "Please Enter.."
Аркеш Патель
источник
4
function Zip-File
    {
    param (
    [string]$ZipName,
    [string]$SourceDirectory 

    )
       Add-Type -Assembly System.IO.Compression.FileSystem
       $Compress = [System.IO.Compression.CompressionLevel]::Optimal
       [System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory,
            $ZipName, $Compress, $false)
    }

Примечание:
ZipName: полный путь к файлу Zip, который вы хотите создать.

SourceDirectory: полный путь к каталогу, содержащему файлы, которые вы хотите заархивировать.

Venkatakrishnan
источник
3

Вот немного улучшенная версия ответа sonjz, она добавляет опцию перезаписи.

function Zip-Files(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)]
        [string] $zipfilename,
        [Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$false)]
        [string] $sourcedir,
        [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$false)]
        [bool] $overwrite)

{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal

    if ($overwrite -eq $true )
    {
        if (Test-Path $zipfilename)
        {
            Remove-Item $zipfilename
        }
    }

    [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)
}
Лу О.
источник
2
Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?
Абаризон
Я взял предыдущий ответ и улучшил его, добавив опцию перезаписи, не сказать больше!
Лу О.
3

Это также должно работать для сжатия одного файла без использования временной папки и использования .Net 4.5, преобразованного из C # из этого ответа StackOverflow . Он использует лучше, используя синтаксис, взятый отсюда .

Использование:

ZipFiles -zipFilename output.zip -sourceFile input.sql -filename name.inside.zip.sql

Код:

function ZipFiles([string] $zipFilename, [string] $sourceFile, [string] $filename)
{
    $fullSourceFile = (Get-Item -Path "$sourceFile" -Verbose).FullName
    $fullZipFile = (Get-Item -Path "$zipFilename" -Verbose).FullName

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

    Using-Object ($fs = New-Object System.IO.FileStream($fullZipFile, [System.IO.FileMode]::Create)) {
         Using-Object ($arch = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)) {
             [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($arch, $fullSourceFile, $filename)
        }
    }
}

С помощью:

function Using-Object
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [AllowNull()]
        [Object]
        $InputObject,

        [Parameter(Mandatory = $true)]
        [scriptblock]
        $ScriptBlock
    )

    try
    {
        . $ScriptBlock
    }
    finally
    {
        if ($null -ne $InputObject -and $InputObject -is [System.IDisposable])
        {
            $InputObject.Dispose()
        }
    }
}
Марк Лопес
источник
Превосходно. Я искал способ заархивировать ОДИН файл без использования этого shell.applicationбизнеса или 7-Zip / других отдельных утилит. Мне Using-Objectтоже нравится эта функция, хотя я пошел на более короткий, быстрый и грязный подход без этого.
Чарли Джойнт,
2

Я использую этот фрагмент, чтобы проверить папку резервных копий в моей базе данных на наличие еще не сжатых файлов резервных копий, сжать их с помощью 7-Zip и, наконец, удалить *.bakфайлы, чтобы сэкономить место на диске. Файлы уведомлений упорядочены по длине (от наименьшего к наибольшему) перед сжатием, чтобы избежать сжатия некоторых файлов.

$bkdir = "E:\BackupsPWS"
$7Zip = 'C:\"Program Files"\7-Zip\7z.exe'

get-childitem -path $bkdir | Sort-Object length |
where
{
    $_.extension -match ".(bak)" -and
    -not (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach
{
    $zipfilename = ($_.fullname -replace "bak", "7z")
    Invoke-Expression "$7Zip a $zipfilename $($_.FullName)"
}
get-childitem -path $bkdir |
where {
    $_.extension -match ".(bak)" -and
   (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach { del $_.fullname }

Здесь вы можете проверить скрипт PowerShell для резервного копирования, сжатия и передачи этих файлов по FTP .

Натан
источник
2

Если у вас установлен WinRAR:

function ZipUsingRar([String] $directory, [String] $zipFileName)
{
  Write-Output "Performing operation ""Zip File"" on Target ""Item: $directory Destination:"
  Write-Output ($zipFileName + """")
  $pathToWinRar = "c:\Program Files\WinRAR\WinRar.exe";
  [Array]$arguments = "a", "-afzip", "-df", "-ep1", "$zipFileName", "$directory";
  & $pathToWinRar $arguments;
}

Значение аргументов: afzip создает zip-архив, df удаляет файлы, ep1 не создает полный путь к каталогу в архиве

Роман О
источник
2

Вот полный пример командной строки для запуска из cmd.exe или из ssh или что вы хотите!

powershell.exe -nologo -noprofile -command "&{ Add-Type -A 'System.IO.Compression.FileSystem' [System.IO.Compression.ZipFile]::CreateFromDirectory('c:/path/to/source/folder/', 'c:/path/to/output/file.zip');}"

С уважением

Alex
источник
2

Загрузка [System.IO.IOException]класса и использование его методов является важным шагом для подавления нежелательных ошибок, поскольку этот класс не является родным для PowerShell, поэтому ожидайте различные контексты ошибок без него.

Я контролирую ошибки моего скрипта для T, но при использовании [System.IO.Compression.ZipFile]класса получаю много лишних красных выводов «файл существует»

function zipFiles(
    [Parameter(Position=0, Mandatory=$true]
    [string] $sourceFolder,
    [Parameter(Position=1, Mandatory=$true]
    [string]$zipFileName,
    [Parameter(Position=2, Mandatory=$false]
    [bool]$overwrite)

{   
Add-Type -Assembly System.IO
Add-Type -Assembly System.IO.Compression.FileSystem

$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal

$directoryTest = (Test-Path $dailyBackupDestFolder)
$fileTest = (Test-Path $zipFileName)

if ( $directoryTest -eq $false) 
{ 
    New-Item -ItemType Directory -Force -Path $dailyBackupDestFolder 
}

     if ( $fileTest -eq $true)
     {
           if ($overwrite -eq $true ){Remove-Item $zipFileName}
     }   


    try
    {
         [System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder,$zipFileName,$compressionLevel)       

    }
    catch [System.IO.IOException] 
    {
       Write-Output ($dateTime + ' | ' + $_.Exception.Message ) | Out-File $logFile -append -force 
    }
} 

Что я делаю здесь, так это перехват этих ошибок ввода-вывода, таких как доступ к уже существующим файлам, перехват этой ошибки и направление ее в файл журнала, который я веду с помощью более крупной программы.

Пол Латур
источник
2

Полные команды командной строки в Windows для сжатия и распаковки каталогов:

  • Для сжатия:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
  • Для извлечения:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.zip','C:\Indus'); }"
Судхир Синха
источник
-4

Этот скрипт перебирает все каталоги и архивирует каждый

Get-ChildItem -Атрибуты d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}

Херардо
источник
1
Единственная часть этого вопроса, относящаяся к 7-летнему вопросу, была «write-zip», которая была принята в 2009 году.
Отклонено