2 votes

Script Powershell pour compresser des fichiers

Je suis nouveau dans Powershell. J'ai un besoin pour lequel je pensais que cela serait parfait. Cependant, je suis rapidement arrivé au point où je me sens dépassé. Fondamentalement, j'ai besoin de créer un fichier .zip.

J'ai un répertoire qui ressemble à ce qui suit:

MyStuff
  Dir1
    Enfant1
      File1.txt
    Enfant2
      File1.png
    Enfant3
      File1.txt
  Dir2
    File1.txt
  File1.txt
  File2.txt
  File3.txt
  ...

Je dois créer un fichier .zip nommé bundle.zip. Bundle.zip ne doit PAS contenir tous les fichiers à l'intérieur de MyStuff. Au lieu de cela, je dois inclure MyStuff/File1.txt, MyStuff/File2.txt, MyStuff/File3.txt et MyStuff/Dir1/* dans le fichier .zip. Je ne sais pas du tout comment faire cela avec PowerShell.

J'ai PowerShell v1.0 installé sur ma machine. J'ai essayé "Write-Zip" dans les Extensions de la Communauté PowerShell, cependant, j'obtiens une erreur qui dit: "Le terme 'Write-Zip' n'est pas reconnu en tant que nom d'une cmdlet, fonction, fichier de script ou programme exécutable".

Qu'est-ce que je fais de mal?

1voto

Govind Points 11

Vous devez télécharger l'extension de la communauté Powershell compatible avec votre version de Powershell installée et l'installer. Une fois l'installation terminée, vous devez déplacer le module PSCX de l'emplacement des fichiers du programme vers le module Powershell, puis essayer d'utiliser la commande Write-Zip.

https://pscx.codeplex.com/releases/view/133199

1voto

ErikE Points 4616

La compression peut être effectuée en utilisant la méthode CreateFromDirectory de la classe .NET System.IO.Compression.ZipFile. Je préfère utiliser .NET plutôt que d'installer des extensions communautaires et d'autres modules complémentaires, afin de maintenir l'environnement du serveur aussi propre que possible.

Je crois que vous ne pouvez pas l'utiliser pour ajouter à une archive zip, mais vous devrez temporairement copier les fichiers et dossiers dans la structure correcte vers un répertoire de staging. Ensuite, vous pouvez créer le fichier zip et supprimer le contenu de staging.

Pour utiliser .NET pour la compression, vous devez d'abord charger l'assembly de classe :

[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")

Ensuite, vous pouvez appeler la classe :

[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)

Où :

$DirPath est le répertoire que vous voulez zipper.

$ZipFilePath est le nom de l'archive zip que vous voulez créer.

$Compressionlevel peut être défini sur Optimal, Fastest ou NoCompression.

$includeBaseDir peut être $true ou $false.

J'ai écrit une fonction à partir de cela pour m'éviter d'avoir à consulter la page de référence .NET tout le temps. Si vous regardez la page, vous verrez qu'il y a aussi une méthode pour décompresser.

.NET 4.5 est requis et je vous encouragerais vivement à mettre à jour PowerShell également. Chaque version a apporté d'importantes améliorations. Il s'avère également que l'utilisation de .NET est efficace, ayant comparé ses performances à celles d'applications zip tierces populaires, il s'en sort bien.

La fonction est assez explicite, assurez-vous simplement de l'exécuter avant de l'appeler. Voici une brève explication syntaxique si vous en avez besoin :

New-ZipFile {DirToZip} {ZipfilePathAndName} {fastORoptimalORnocompression} {IncludeBaseDirectoryInZip($true or $false)}

Donc pour zipper E:\stuff vers D:\zipfile.zip en utilisant une compression optimale et inclure le basedir .\stuff dans le fichier zip, vous exécuteriez :

New-ZipFile 'E:\stuff' 'D:\zipfile.zip' Optimal $true

Voici la fonction:

#region function New-ZipFile
<#
.Synopsis
   Crée un fichier zip à partir d'un répertoire.
.DESCRIPTION
   Crée un fichier zip à partir d'un répertoire. Les options incluent le niveau de compression et s'il faut inclure ou non le répertoire de base. Référence de la classe : https://msdn.microsoft.com/en-us/library/hh875104(v=vs.110).aspx
.EXAMPLE
   New-ZipFile c:\dir c:\zipfile.zip Fastest $True
.EXAMPLE
   New-ZipFile c:\dir c:\zipfile.zip Optimal $True
.INPUTS
   Entrées pour cette cmdlet (si applicable)
.OUTPUTS
   Sortie de ce cmdlet (si applicable)
.NOTES
   Notes générales
.COMPONENT
   Composant auquel appartient ce cmdlet
.ROLE
   Rôle auquel appartient ce cmdlet
.FUNCTIONALITY
   La fonctionnalité qui décrit le mieux ce cmdlet
#>
function New-ZipFile
{
    Param
    (
        # Le répertoire à zipper.
        [Parameter(Mandatory=$true, 
                   Position=0)]
        [ValidateNotNullOrEmpty()]
        [string]$DirPath,

        # Le nom du fichier zip.
        [Parameter(Mandatory=$true, 
                   Position=1)]
        [ValidateNotNullOrEmpty()]
        [string]$ZipFilePath,

        # Spécifie des valeurs qui indiquent si une opération de compression met l'accent sur la vitesse ou sur la taille de la compression.
        [Parameter(Mandatory=$true, 
                   Position=2)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet("Fastest", "NoCompression", "Optimal", ignorecase=$True)]
        [string]$CompressionLevel,

        # $True pour inclure le nom du répertoire de sourceDirectoryName à la racine de l'archive ; $False pour inclure uniquement le contenu du répertoire.
        [Parameter(Mandatory=$true, 
                   Position=3)]
        [ValidateNotNullOrEmpty()]
        [bool]$includeBaseDir
          )

    #Charger l'assembly zip .NET 4.5
    [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
    # Zipper le répertoire.
    [System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
}
#endregion

MODIFIER : Le Scripting guy a écrit un article où il montre une alternative pour charger l'assembly, c'est un peu plus propre.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X