Comment créer une archive zip avec PowerShell?

244

Est-il possible de créer une archive zip à l'aide de PowerShell?

Valentin Vasilyev
la source
un échantillon avec le code source complet?
Kiquenet

Réponses:

124

Si vous vous dirigez vers CodePlex et récupérez les extensions de communauté PowerShell , vous pouvez utiliser leur write-zipapplet de commande.

Puisque

CodePlex est en mode lecture seule en préparation de l'arrêt

vous pouvez accéder à la galerie PowerShell .

Matt Hamilton
la source
114
Oui, et il utilise 7z comme bibliothèque principale pour la plupart de ses applets de commande de compression. Je sais, car je l'ai implémenté;) +1
x0n
1
lol beau travail, x0n. J'ai implémenté le fournisseur de magasin d'alimentation dans PSCX. Un peu moins pratique mais des tonnes de plaisir. :)
Matt Hamilton
1
S'il utilise 7z, est-il possible de compresser à l'aide d'un mot de passe?
mack
1
@SemiDementedwrite-zip [input file/folder] [output file]
joshschreuder
9
Powershell 5 est livré avec une applet de
Benoit Patra
255

Une alternative PowerShell pure qui fonctionne avec PowerShell 3 et .NET 4.5 (si vous pouvez l'utiliser):

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

Passez simplement le chemin complet vers l'archive zip que vous souhaitez créer et le chemin complet vers le répertoire contenant les fichiers que vous souhaitez compresser.

petrsnd
la source
1
Cela nécessite-t-il réellement Powershell 3.0, ou juste .net 4.5? Cela me semble très clair sur les fonctionnalités réelles de PowerShell, au lieu d'être simplement une programmation .net.
bwerks
@bwerks voir la partie «modifier» ici
2013
Je cherchais un moyen de compresser un seul gros fichier, mais apparemment il n'y a pas de méthode pour cela. J'ai dû écrire du code qui créerait un nouveau répertoire, y copier le fichier unique, compresser ce répertoire dans un nouveau fichier zip, puis supprimer le répertoire à nettoyer.
Baodad
1
@Baodad, voyez ma réponse.
Dherik
J'aurais dû lire que j'avais besoin du chemin complet. Garçon, c'était déroutant! BTW, cela devrait être la réponse acceptée
Kolob Canyon
244

Ajout Compress-Archiveet Expand-Archiveapplets de commande PowerShell v5.0 . Les pages liées ont des exemples complets, mais l'essentiel est:

# 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
Brant Bobby
la source
11
PowerShell v5.0 a été officiellement publié maintenant. Il est également livré avec Windows 10.
Ohad Schneider
Maintenant disponible ici: microsoft.com/en-us/download/details.aspx?id=50395
starlocke
2
Du paragraphe 2 de la Compress-Archivedescription: "... la taille de fichier maximale que vous pouvez compresser en utilisant Compress-Archive est actuellement de 2 Go. Il s'agit d'une limitation de l'API sous-jacente" Cependant, si vous utilisez, System.IO.Compression.ZipFilevous pouvez contourner cette limitation.
AMissico
2
La limite de 2 Go a été héritée de System.IO.Compression.ZipFile. Si le framework .NET que vous utilisez n'a pas cette limite, le CmdLet ne doit pas atteindre cette limite. J'ai vérifié dans le code.
TravisEz13
2
@Pramod il n'y a pas de -OutputPathparamètre.
BrainSlugs83
57

Une manière native avec le dernier framework .NET 4.5, mais entièrement sans fonctionnalités:

Création:

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

Extraction:

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

Comme mentionné, totalement sans fonctionnalités, ne vous attendez donc pas à un indicateur de remplacement .

MISE À JOUR: Voir ci-dessous pour les autres développeurs qui ont développé cela au fil des ans ...

sonjz
la source
Pourquoi utiliseriez-vous la méthode sans particularité?
Pluton
Cela devrait être la réponse acceptée par ordre de date de publication et de précédent. Quant à votre commentaire mis à jour - il existe vraiment un grand nombre de façons de le faire maintenant. Je suis confronté au besoin de cette fonctionnalité et je suis sur PowerShell 4, la première chose que j'ai trouvée est la manière native. C'était une bonne question en 2009. Je pense toujours qu'il aurait pu y avoir d'autres recherches présentées dans la question à l'origine.
DtechNet
45

Installez 7zip (ou téléchargez la version de ligne de commande à la place) et utilisez cette méthode 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;
}

Vous pouvez l'appeler comme ceci:

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"
Karl Glennon
la source
6
Si 7zip est sur votre chemin, alors tout ce que vous devez écrire est "& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip"
aboy021
5
Si vous ne souhaitez pas l'installer, vous pouvez télécharger la version en ligne de commande à la place. (Regardez simplement sur la page de téléchargement de 7-zip.) C'est juste un exécutable, et la syntaxe de la commande est la même. L'exécutable est un nom différent, cependant; c'est 7za.exe pour une raison quelconque. Je l'ai fait sur un certain nombre de projets et je n'ai jamais été déçu.
jpmc26
J'ai essayé avec les outils .net et Powershell pendant trop longtemps jusqu'à ce que le chemin 7zip fonctionne tout de suite. Une boucle foreach simple sur le fichier $ fait l'affaire& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
SebK
17

Le lot a changé depuis la publication de la réponse initiale. Voici quelques-uns des derniers exemples utilisant la commande Compress-Archive .

Commande pour créer un nouveau fichier d'archive Draft.zip, en compressant deux fichiers, Draftdoc.docxet diagram2.vsd, spécifié par le Pathparamètre. Le niveau de compression spécifié pour cette opération est optimal.

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

Commande pour créer un nouveau fichier d'archive Draft.zip, en compressant deux fichiers, Draft doc.docxet Diagram [2].vsd, spécifié par le LiteralPathparamètre. Le niveau de compression spécifié pour cette opération est optimal.

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

Commande pour créer un nouveau fichier d'archive,, Draft.zipdans le C:\Archivesdossier. Le nouveau fichier d'archive contient tous les fichiers du dossier C: \ Reference , car un caractère générique a été utilisé à la place de noms de fichiers spécifiques dans le paramètre Path .

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

La commande crée une archive à partir d'un dossier entier, C:\Reference

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

PowerShell ajoute .zipautomatiquement l' extension au nom de fichier.

Krishna Prasad Yalavarthi
la source
15

Edit two - Ce code est un kluge laid et laid des temps anciens. Tu n'en veux pas.

Cela compresse le contenu de .\into .\out.zipavec System.IO.Packaging.ZipPackage en suivant l'exemple ici

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

Edit: peu fiable pour les fichiers plus volumineux, peut-être> 10 Mo, YMMV. Quelque chose à voir avec les preuves du domaine d'application et le stockage isolé. L' approche .NET 4.5 plus conviviale fonctionne bien avec PS v3, mais voulait plus de mémoire dans mon cas. Pour utiliser .NET 4 à partir de PS v2, les fichiers de configuration nécessitent un ajustement non pris en charge .

noam
la source
le problème majeur de ZipPackage est qu'il n'est pas un fichier ZIP normal , mais contient un fichier xml de contenu. voir: [comment éviter [Content_Types] .xml dans la classe ZipPackage de .net - Stack Overflow] ( stackoverflow.com/questions/3748970/… )
aaron
@aaron Une raison de plus pour ne plus jamais l'utiliser! Vous avez une concurrence
acharnée
12

Donner ci-dessous une autre option. Cela zippera un dossier complet et écrira l'archive dans un chemin donné avec le nom donné.

Nécessite .NET 3 ou supérieur

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)
karthikeyan
la source
10

Voici une solution native pour PowerShell v5, à l'aide de l'applet de commande Compress-Archive Création de fichiers Zip à l'aide de PowerShell .

Voir également les documents Microsoft pour Compress-Archive .

Exemple 1:

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

Exemple 2:

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

Exemple 3:

Write-Output $files | Compress-Archive -DestinationPath $outzipfile
Aaron
la source
7

Pour la compression, j'utiliserais une bibliothèque (7-Zip est bon comme le suggère Michal ).

Si vous installez 7-Zip , le répertoire installé contiendra 7z.exece qui est une application console.
Vous pouvez l'invoquer directement et utiliser n'importe quelle option de compression de votre choix.

Si vous souhaitez vous engager avec la DLL, cela devrait également être possible.
7-Zip est un logiciel gratuit et open source.

nik
la source
2
Voici un exemple d'utilisation de 7 zip avec cryptage AES de Powershell: codeblog.theg2.net/2010/02/…
Greg Bray
7

Et alors System.IO.Packaging.ZipPackage?

Cela nécessiterait .NET 3.0 ou supérieur.

#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()

via Anders Hesselbom

Peter P.
la source
5

Pourquoi personne ne regarde la documentation ?? Il existe une méthode prise en charge pour créer un fichier zip vide et y ajouter des fichiers individuels intégrés dans la même bibliothèque .NET 4.5 que tout le monde fait référence.

Voir ci-dessous pour un exemple de code:

# 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()

Je vous encourage à parcourir la documentation si vous avez des questions.

Pluton
la source
2
Merci pour cela, c'est parfait. Surtout par rapport à l'applet de commande Compress-Archive qui est mal conçue et n'a pas un bon moyen de spécifier les chemins à l'intérieur du zip.
Rafael Kitover
4

C'est vraiment obscur mais ça marche. 7za.exe est une version autonome de 7zip et est disponible avec le package d'installation.

# 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

}
Michal Sznajder
la source
4

Si quelqu'un a besoin de compresser un seul fichier (et non un dossier): 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
la source
Ce code repose sur une application shell et devine ensuite 500 ms pour attendre qu'il se termine ... Je ne suis pas en désaccord que cela fonctionne (dans la plupart des cas). Mais il crée des popups lorsque vous l'utilisez dans tous les cas où l'ajout d'un fichier compressé prend un certain temps (facilement reproduit avec l'ajout de gros fichiers ou le travail avec de grandes zips). De plus, si une opération zip est plus lente que le temps de veille spécifié, il ne sera pas possible d'ajouter le fichier et de laisser une boîte de dialogue contextuelle. C'est terrible pour les scripts. J'ai également dévalorisé l'autre réponse qui repose sur un objet COM car il ne résout pas ces pièges.
Pluton du
4

Voici le code de travail, compresser tous les fichiers d'un dossier source et créer un fichier zip dans le dossier de destination.

    $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.."
Arkesh Patel
la source
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)
    }

Remarque:
ZipName: Chemin complet du fichier Zip que vous souhaitez créer.

SourceDirectory: chemin complet vers le répertoire contenant les fichiers que vous souhaitez compresser.

Venkatakrishnan
la source
3

Voici une version légèrement améliorée de la réponse de sonjz, elle ajoute une option d'écrasement.

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)
}
Lou O.
la source
2
Pourriez-vous élaborer davantage votre réponse en ajoutant un peu plus de description sur la solution que vous proposez?
abarisone
J'ai pris une réponse précédente et l'ai améliorée en ajoutant l'option d'écrasement, pas grand chose de plus à dire!
Lou O.
3

Cela devrait également fonctionner pour compresser un seul fichier sans utiliser de dossier temporaire et en utilisant .Net 4.5 natif, converti à partir de C # à partir de cette réponse StackOverflow . Il utilise une syntaxe plus agréable à partir d' ici .

Usage:

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

Code:

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

En utilisant:

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()
        }
    }
}
Mark Lopez
la source
Excellent. Je cherchais un moyen de compresser UN fichier sans utiliser cette shell.applicationentreprise ou 7-Zip / autres utilitaires distincts. J'aime aussi la Using-Objectfonction, bien que j'aie opté pour une approche plus courte et rapide sans cela.
Charlie Joynt
2

J'utilise cet extrait pour vérifier mon dossier de sauvegardes de base de données pour les fichiers de sauvegarde pas encore compressés, les compresser à l'aide de 7-Zip, et enfin supprimer les *.bakfichiers pour économiser de l'espace disque. Les fichiers d'avis sont classés par longueur (du plus petit au plus grand) avant la compression pour éviter que certains fichiers ne soient pas compressés.

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

Ici, vous pouvez vérifier un script PowerShell pour sauvegarder, compresser et transférer ces fichiers via FTP .

Nathan
la source
2

Si vous avez installé 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;
}

Signification des arguments: afzip crée une archive zip, df supprime des fichiers, ep1 ne crée pas de chemin de répertoire complet dans l'archive

Roman O
la source
2

Voici un exemple de ligne de commande complet pour lancer depuis cmd.exe ou depuis ssh ou ce que vous voulez!

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');}"

Cordialement

Alex
la source
2

Chargement du [System.IO.IOException] classe et utiliser ses méthodes est une étape importante pour supprimer les erreurs indésirables, car il s'agit d'une classe non native de PowerShell, alors attendez-vous à divers contextes d'erreurs sans elle.

J'ai contrôlé mon script par erreur sur le T, mais j'ai obtenu beaucoup de sortie supplémentaire de «fichier existe» en utilisant la [System.IO.Compression.ZipFile]classe

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

Ce que je fais ici, c'est attraper ces erreurs d'E / S, comme accéder aux fichiers qui existent déjà, attraper cette erreur et la diriger vers un fichier journal que je gère avec un programme plus grand.

Paul Latour
la source
2

Les commandes de ligne de commande complètes dans Windows pour compresser et extraire le répertoire sont les suivantes:

  • Pour la compression:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
  • Pour l'extraction:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.zip','C:\Indus'); }"
Sudhir Sinha
la source
-4

Ce script parcourt tous les répertoires et zippe chacun

Get-ChildItem -Attributes d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}

Gerardo
la source
1
La seule partie de cette question pertinente pour la question de 7 ans était "write-zip", qui a été la réponse acceptée en 2009.
Rejeté