Question [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)

Plus d'informations
il y a 11 ans 10 mois #12201 par Laurent Dardenne
Laurent Dardenne écrit:

il est préférable d'utiliser Add-Type, LoadFrom semble ou a peu d'avenir (deprecated).

Une erreur de ma part, c'est la méthode Load qui est deprecated sous dotnet 4.0, LoadFrom contient 2 surcharges (peu utilisés sous PS) qui sont obsolètes , on peut donc continuer à l'utiliser.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 10 mois #12203 par Laurent Dardenne
Le code corrigé contient deux erreurs dues à une translation parasite de JOOMLA. Le mieux serait de joindre le fichier.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 10 mois #12211 par Matthew BETTON
La première fois, j'ai pu éditer le premier post et ajouter un fichier... mais joomla n'en a pas voulu car il s'agissait d'un fichier de type .psm1 (.ps1, zip et autres sont par contre acceptés).

J'ai donc voulu recommencer : Joomla ne me propose plus d'ajouter un fichier :angry:

Alors je le fais ici... mais ce n'est pas bien pratique

La pièce jointe ioniczip_psm1.zip est absente ou indisponible

Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 10 mois #12212 par SiSMik
Matthew BETTON écrit:

La première fois, j'ai pu éditer le premier post et ajouter un fichier... mais joomla n'en a pas voulu car il s'agissait d'un fichier de type .psm1 (.ps1, zip et autres sont par contre acceptés).

J'ai donc voulu recommencer : Joomla ne me propose plus d'ajouter un fichier :angry:

Alors je le fais ici... mais ce n'est pas bien pratique


J'en profite pour appuyer le fait qu'un \"vrai forum\" serait plus adapté (avec des MSG privé par exemple) :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #13450 par Laurent Dardenne
Salut,
comme je comptes utiliser, j'ai qq remarques sur le code.

Dans Set-ZipContent ajouter un bloc finally :
[code:1]
Write-Debug \"Creating Zip Object ...\"
try{
$objZip = new-object Ionic.Zip.ZipFile
}
catch{
Write-Error \"An error has occured while creating new Zip file object : $($_.Exception.Message)\"
break
}
Finally {
if ($objzip -ne $null)
{$objzip.Dispose()}
}
[/code:1]

Dans Get-ZipContent, je procéderais plutot comme ceci :
[code:1]
Process{
Foreach($Path in $FilePath){
Write-Debug \"Reading Zip file content from '$Path' ...\"
try{
$objZip = [Ionic.Zip.ZipFile]::Read((Resolve-Path $Path).path)
foreach($File in $objZip) {
if($List)
{ $File.FileName }
else
{ $File }
}
}
catch{
Write-Error \"An error has occured while reading Zip file content from '$Path' : $($_.Exception.Message)\"
}
Finally {
if ($objzip -ne $null)
{$objzip.Dispose()}
}
}
}
[/code:1]

Dans Set-ZipObjectEncryption au lieu de [String]$DataEncryption, j'utiliserais :
[code:1]
[Ionic.Zip.EncryptionAlgorithm] $DataEncryption,
[/code:1]

Dans Set-ZipObjectPassword, le mot de passe peut-il être une chaîne vide ?

Dans Add-ZipContent ajouter la libération de l'objet :
[code:1]
try {
if(-not (Test-Path $Destination)){
Write-Debug \"Zip file '$Destination' does not exist, creating it ...\"
Write-Debug \"Creating Zip Object ...\"
try{
$objZip = new-object Ionic.Zip.ZipFile
}
catch{
Write-Error \"An error has occured while creating new Zip file object : $($_.Exception.Message)\"
break
}
}
else{
Write-Debug \"Reading Zip file content from '$Destination' ...\"
try{
$objZip = [Ionic.Zip.ZipFile]::Read($Destination)
}
catch{
Write-Error \"An error has occured while reading Zip file content from '$Destination' : $($_.Exception.Message)\"
break
}
}
}
Finally {
if ($objzip -ne $null)
{$objzip.Dispose()}
}
[/code:1]

Dans Expand-Zip, ajouter un controle sur la validité de l'instance :
[code:1]
finally{
if ($ZipContent -ne $null)
{$ZipContent.Dispose()}
}
[/code:1]
Il y a un truc qui me chiffone, c'est la libération de l'objet dans une fonction appelée, par exemple Set-ZipObjectEncryption.
C'est un choix de conception, mais il me semble qu'il y ait un risque d'effet de bord.

Je remarque que la classe Ionic.Zip.ZipFile est riche de fonctionnalités, par exemple il existe la méthode AddSelectedFiles qui permet d'ajouter des fichiers à l'aide de critères : \"name = *.txt AND size >= 100k\"
Une candidature pour le paramètre -Filter ?

Dans l'aide, les liens pointant sur cheeso.members.winisp.net/DNZHelp/html... sont HS.
Le mieux serait de livrer la DLL et le .CHM.

Je t'avais signalé l'usage de Add-Type pour charger la librairie, mais comme j'ai placé la DLL dans le GAC 2.0 cela ne fonctionne pas avec cette DLL.
Il faut soit créer un manifeste de module, soit préciser le nom complet :
[code:1]
Add-type -AssemblyName \"Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c\"
[/code:1]
J'ai un faible pour le manifeste, car le nom simple suffit, une modification du numéro de version n'impacterait pas le module, bref ça c'est un autre sujet ;-)

Il y a un bug avec la description d'un alias déclaré dans un module :#https://connect.microsoft.com/PowerShell/feedback/details/576223/missing-alias-description-after-using-import-module#details

Pour finir, voici une fonction à ajouter au module :
[code:1]
Function ConvertTo-Sfx{
#
# Depend : Ionic.Zip.Dll
# Programme ConvertZipToSfx.cs, copyright (c) 2008 by Dino Chiesa
# Adapté par Laurent Dardenne 12/2012
#

<#
.SYNOPSIS
Crée un fichier autoextractible à partir d'un fichier d'archive au standaed .ZIP.

.DESCRIPTION
Crée un fichier exécutable contenant une archive et le moteur de décompression du format ZIP.

.PARAMETER $ZipFile
Nom du fichier à transformer en .exe. Le nom du fichier généré est identique, excepté l'extension.
Le contenu de ce fichier respecte le format de compression ZIP.

.PARAMETER $ExeOnUnpack
Ligne de commande à exécuter une fois la décompression terminée.

.PARAMETER $ExtractDir
Nom du répertoire utilisé lors de l'opération d'extraction.
Ce paramètre est optionnel.

.PARAMETER $Comment
Commentaires associés à l'exécutable crée.
Ce paramètre est optionnel.

.PARAMETER $CmdLine
L'exécutable créé est un programme console.

.PARAMETER $GUI
L'exécutable créé est une application Winform.

.EXAMPLE
$ZipFile='C:\Temp\Test.zip'
$Command=\"Powershell -noprofile -File .\Setup.ps1\"
ConvertTo-Sfx $ZipFile -ExeOnUnpack $Command
.
Description
Ces commandes générent un fichier autoextractible 'C:\Temp\Test.exe' à partir de l'archive 'C:\Temp\Test.zip'.
L'exécutable généré est de type console.
Une fois la décompression effectuée, la ligne de commande contenue dans la variable $Command sera exécutée.
Dans cet exemple, l'exécutable généré utilisera par défaut son répertoire d'exécution.

.EXAMPLE
ConvertTo-Sfx C:\Temp\Test.zip -GUI -Comment \"MySetup\" -ExeOnUnpack \"Powershell -noprofile -File .\Setup.ps1\"
.
Description
Ces commandes générent un fichier autoextractible 'C:\Temp\Test.exe' à partir de l'archive 'C:\Temp\Test.zip'.
L'exécutable généré est de type Winform.
Une fois la décompression effectuée, la ligne de commande précisée via la paramètre -ExeOnUnpack sera exécutée.
Dans cet exemple, l'exécutable généré utilisera par défaut son répertoire d'exécution.

#>

[CmdletBinding(DefaultParameterSetName = \"CmdLine\"«»)]
[OutputType(\"CmdLine\", [Object])]

Param (
[ValidateNotNullOrEmpty()]
[ValidateScript( {Test-Path $_})]
[Parameter(Position=0, Mandatory=$true)]
[string] $ZipFile,
[ValidateNotNullOrEmpty()]
[Parameter(Position=1, Mandatory=$true)]
[string] $ExeOnUnpack,
[ValidateNotNullOrEmpty()]
[Parameter(Position=2, Mandatory=$false)]
[string] $ExtractDir=$null,
[ValidateNotNullOrEmpty()]
[Parameter(Position=0, Mandatory=$false)]
[string] $Comment,
[Parameter(ParameterSetName=\"CmdLine\"«»)]
[switch] $CmdLine,
[Parameter(ParameterSetName=\"GUI\"«»)]
[switch] $GUI
)

function ConvertZipToSfx{
$TargetName = $ZipFile -Replace '\.zip$',\".exe\"

Write-Host (\"Converting file {0} to SFX {1}\" -F $ZipFile, $TargetName)

$options = New-Object Ionic.Zip.ReadOptions -Property @{ StatusMessageWriter = [System.Console]::Out }
try {
$zip = [Ionic.Zip.ZipFile]::Read($ZipFile, $options)
$zip.Comment =$Comment
$sfxOptions = New-Object Ionic.Zip.SelfExtractorSaveOptions -Property @{
Flavor = $Flavor;
DefaultExtractDirectory = $ExtractDir;
PostExtractCommandLine = $ExeOnUnpack
}
try
{
$zip.SaveSelfExtractor($TargetName, $sfxOptions)
}
catch
{
Throw \"Exception while creating the self extracting archive: $_\"
}
}
Finally {
if ($zip -ne $null)
{$zip.Dispose()}
}
}#ConvertZipToSfx

if ($PsCmdlet.ParameterSetName -eq \"CmdLine\"«»)
{$Flavor = [Ionic.Zip.SelfExtractorFlavor]::ConsoleApplication}
else
{$Flavor = [Ionic.Zip.SelfExtractorFlavor]::WinFormsApplication}

ConvertZipToSfx

}#ConvertTo-Sfx
[/code:1]
La génération d'un GUI est bien faîte.
A tester...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #13452 par SiSMik
Une petite question juste comme ça

Pourquoi utiliser -ne $null ?
[code:1]if ($objzip -ne $null)
{$objzip.Dispose()}[/code:1]

C'est juste pour ma culture perso caar j'aurais plutôt fait comme ça
[code:1]if ($objzip)
{$objzip.Dispose()}[/code:1]

Bonne nuit :)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.113 secondes
Propulsé par Kunena