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

Plus d'informations
il y a 11 ans 3 mois #13456 par Laurent Dardenne
benduru écrit:

Pourquoi utiliser -ne $null ?

Pour préciser l'intention.
benduru écrit:

j'aurais plutôt fait comme ça

Je suis d'accord, mais ceci me rend prudent.

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 3 mois #13469 par Matthew BETTON
Salut la compagnie,

J'espère que pour vous tous, Noël s'est bien passé (pas trop de \"dinde au whisky\" !).

Il en reste une ! (Une fête... et en plus, ce sera l'occasion pour moi de prendre un an de plus, le 31/12 ^^)

Merci Laurent pour ton nouveau retour.

Pour l'information (de tous), je n'ai pas développé ce script au boulot / pour le boulot.
C'était pour faire suite à une discussion qui avait eu lieu ici même, et pour apprendre, via une nouvelle expérience.
Et c'est beaucoup mieux avec un retour d'expérience ;)
Cela fait donc plaisirs de voir une nouvelle fois les bienfaits d'une communauté : Partager, Comprendre et Apprendre :)

Laurent Dardenne écrit:

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 m'étais posé la même question lors de l'écriture de ce code. Dans les premières versions ce n'était pas le cas.
Actuellement, lorsque c'est le cas (une erreur est levée dans la fonction appelée), on sort systématiquement du code, mais dans la fonction appelante ...
Comme tu le dis, c'est un choix, et ta remarque me montre que je n'ai pas fait le bon. J'ai donc modifié le code en ce sens.

Au passage, j'ai supprimé la fonction 'Save-ZipFile' qui n'apportait rien, sauf peut être une répétition de code.
Elle était utilisée dans 'Set-ZipContent' et 'Add-ZipContent', où l'on peut maintenant observer ce bloc :

[code:1]
Write-Debug \"Saving zip file '$Destination' ...\"
try{
$objZip.Save($Destination)
}
catch{
Write-Error \"An error has occured while saving zip file '$Destination' : $($_.Exception.Message)\"
}
finally{
$objZip.Dispose()
}
[/code:1]

Laurent Dardenne écrit:

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.


Liens corrigés. Ils ont changé d'hébergeur (depuis qu'ils sont sponsorisés ? Pour pouvoir profiter de Tee Shirts et de tasse à café au logo du sponsor ? ).
J'ai simplement du remplacer le nom de domaine, le chemin restant inchangé (ouf! Ils sont restés cohérents) :)
Une question : Peut on intégrer dans le ZIP partagé ici, une DLL développée par une autre communauté (Codeplex) ?
Jusqu'à présent, je ne l'ai pas fait, car je préfère laisser (rendre) à César ce qui est à César ... ^^

Laurent Dardenne écrit:

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


A la lecture de l'aide :

When setting the Password, you may also want to explicitly set the Encryption property, to specify how to encrypt the entries added to the ZipFile. If you set the Password to a non-null value and do not set Encryption, then PKZip 2.0 (\"Weak\") encryption is used. This encryption is relatively weak but is very interoperable. If you set the password to a null value (Nothing in VB), Encryption is reset to None.


Si le mot de passe n'est pas null et qu'aucune encryption n'est précisée, l'encryption \"weak\" est utilisée.

Si le mot de passe est vide : pas d'encryption. En même temps, ça reste logique. Penses-tu qu'il faille (?*) :

1- Simplement le préciser dans l'aide
2- Tester si le mot de passe est vide et dans ce cas renvoyer un message ou lever une exception (ou inclusif)
3- Les 2

\"* : Envoie ta réponse au 36 212 (prix d'un SMS.... bla bla bla)\"

J'avais placé ce code, pour éviter l'utilisation d'une encryption sans qu'un mot de passe ne soit précisé :

[code:1] if($Encryption -and -not $Password){
Write-Warning \"'-Password' parameter is a mandatory parameter when '-Encryption' parameter is used.\"
break
}[/code:1]

Laurent Dardenne écrit:

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 ?


Why not ? Si quelqu'un dans la salle dispose de temps et se propose :D


Bon, je termine les tests et je posterai ensuite le module modifié... avec Manifeste ;)

@ +

Matthew<br><br>Message édité par: Matthew BETTON, à: 29/12/12 23:15

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

Plus d'informations
il y a 11 ans 3 mois #13475 par Matthew BETTON
Laurent Dardenne écrit:


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


Si nous le faisons, cela remet en question l'existence du paramètre 'Encryption' de 'Set-ZipContent' et 'Add-ZipContent' :

[code:1]
[parameter(Mandatory=$False)]
[ValidateSet(\&quot;PkzipWeak\&quot;,\&quot;WinZipAes128\&quot;,\&quot;WinZipAes256\&quot;,\&quot;Unsupported\&quot;«»)]
[String]$Encryption = $null,
[/code:1]

Nous obtenons alors ce message d'erreur (qui reste donc logique) :

[code:1]Set-ZipObjectEncryption : Impossible de traiter la transformation d'argument sur le paramètre «DataEncryption».
Impossible de convertir la valeur «» en type «Ionic.Zip.EncryptionAlgorithm». Erreur: «Le nom d'identificateur ne
peut pas être traité, car il est impossible de différencier les noms d'énumérateur suivants : None, PkzipWeak,
WinZipAes128, WinZipAes256, Unsupported. Essayez un nom d'identificateur plus spécifique.»
Au caractère C:\Windows\system32\WindowsPowerShell\v1.0\Modules\IonicZip\IonicZip.psm1:353 : 51
+ if(-not (Set-ZipObjectEncryption -DataEncryption $Encryption -zipObject $objZip ...
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidData : (:«») [Set-ZipObjectEncryption], ParameterBindingArgumentTransformationExcep
tion
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Set-ZipObjectEncryption[/code:1]

@ +

Matthew

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

Plus d'informations
il y a 11 ans 3 mois #13480 par Laurent Dardenne
Matthew BETTON écrit:

(pas trop de \&quot;dinde au whisky\&quot; !).

J'ai flambé la mienne, je ne me souviens plus pourquoi...
Matthew BETTON écrit:

Cela fait donc plaisirs de voir une nouvelle fois les bienfaits d'une communauté : Partager, Comprendre et Apprendre :)

Eh oui, seul c'est bien, à deux c'est mieux et à plusieurs c'est bien meilleur :-)
Comme j'envisage de l'intégrer à une solution, je ne cache pas que je suis aussi intéressé par son amélioration.
Matthew BETTON écrit:

Comme tu le dis, c'est un choix, et ta remarque me montre que je n'ai pas fait le bon.

Au contraire ton choix était cohérent dans la version citée. Je posais cette question en cas d'ajouts/modification du code existant.
Matthew BETTON écrit:

Une question : Peut on intégrer dans le ZIP partagé ici, une DLL développée par une autre communauté (Codeplex) ?

Oui c'est son objectif. Pour un usage communautaire je ne juge pas utile de consulter la licence.
Matthew BETTON écrit:

Penses-tu qu'il faille (?*) :

Je ne sais pas, là tu me poses une colle.
J'ai posé cette question sans entrer dans les détails de cette partie de code, j'ai juste consulté les signatures de fonctions.
Et celle-ci m'a fait tiquée, car mon intention était d'avoir la possibilité, par exemple, de placer un password sur une archive existante.
Matthew BETTON écrit:

J'avais placé ce code, pour éviter l'utilisation d'une encryption sans qu'un mot de passe ne soit précisé :

Oui, je comprends. J'imaginais de rendre publique cette fonction. Il est donc normal que l'existant ne me convienne pas.
L'autre difficulté est de déterminer qui fait ce test, la fonction appelante ou celle appelée ?
Matthew BETTON écrit:

Why not ? Si quelqu'un dans la salle dispose de temps et se propose :D

Je prends !
Matthew BETTON écrit:

je termine les tests

C'est ça qui m'a manqué et qui m'a fait hésiter à partir sur ton module, je n'avais pas le temps ni l'envie de coder les tests unitaires, ni de réécrire ce que tu avais déjà écrit.
Là on touche à des questions de conception de librairie, c'est à dire qu'on écrit du code pour les autres et pas pour soi. On ne peut donc bien évidement pas contenter tout le monde dans ce type d'exercice :-)
Si je veux en faire autre chose que ce pourquoi tu l'as conçue, c'est à moi de l'assumer.
Matthew BETTON écrit:

Si nous le faisons, cela remet en question l'existence du paramètre 'Encryption' de 'Set-ZipContent' et 'Add-ZipContent' :

Je suis d'accord.
Mais je ne comprend pas pourquoi à partir de l'énumération EncryptionAlgorithm, tu as construit un sous ensemble (\&quot;PkzipWeak\&quot;,\&quot;WinZipAes128\&quot;,\&quot;WinZipAes256\&quot;,\&quot;Unsupported\&quot;).
Pour moi si une énumération existe je l'utilise et j'utilise l'attribut ValidateSet lorsque je n'ai pas de classe d'enumération.
Avec une énumération, sa modification dans CE contexte n'impacte pas le code.
Et comme j'ai débuté avec le Pascal, j'ai un faible pour ce type de structure , d'ou la présence de cette fonction .

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 3 mois #13484 par Matthew BETTON
Laurent Dardenne écrit:

Je suis d'accord.
Mais je ne comprend pas pourquoi à partir de l'énumération EncryptionAlgorithm, tu as construit un sous ensemble (\&quot;PkzipWeak\&quot;,\&quot;WinZipAes128\&quot;,\&quot;WinZipAes256\&quot;,\&quot;Unsupported\&quot;).
Pour moi si une énumération existe je l'utilise et j'utilise l'attribut ValidateSet lorsque je n'ai pas de classe d'enumération.
Avec une énumération, sa modification dans CE contexte n'impacte pas le code.
Et comme j'ai débuté avec le Pascal, j'ai un faible pour ce type de structure , d'ou la présence de cette fonction .


Ok, j'essaye de comprendre (il faut que j'y arrive!).

Quelque chose comme ça :

[code:1]$EncryptionEnums=@{}
$EncryptionEnums.EncryptionAlgorithm=@(\&quot;None\&quot;,\&quot;PkzipWeak\&quot;,\&quot;WinZipAes128\&quot;,\&quot;WinZipAes256\&quot;,\&quot;Unsupported\&quot;«»)
New-Enum $EncryptionEnums

[EncryptionAlgorithm]$Encryption = \&quot;PkzipWeak\&quot;

$zipObject = new-object Ionic.Zip.ZipFile

Switch($Encryption){
[EncryptionAlgorithm]::None {Set-ZipObjectEncryption [Ionic.Zip.EncryptionAlgorithm]::None}
[EncryptionAlgorithm]::«»PkzipWeak {Set-ZipObjectEncryption [Ionic.Zip.EncryptionAlgorithm]::«»PkzipWeak}
[EncryptionAlgorithm]::WinZipAes128 {Set-ZipObjectEncryption [Ionic.Zip.EncryptionAlgorithm]::WinZipAes128}
[EncryptionAlgorithm]::WinZipAes256 {Set-ZipObjectEncryption [Ionic.Zip.EncryptionAlgorithm]::WinZipAes256}
[EncryptionAlgorithm]::Unsupported {Set-ZipObjectEncryption [Ionic.Zip.EncryptionAlgorithm]::Unsupported}
}

#
# Traitement
#

$zipObject.dispose()
[/code:1]

Du coup, je dois définir l'énumération lors de l'import du module.

Je peux ensuite faire un 'cast' sur '$Encryption' dans le bloc 'param()', ce qui évite d'utiliser le '[ValidateSet]' : si l'utilisateur de la fonction / Cmdlet ne saisie pas une valeur de l'énumération, alors il obtient un message d'erreur, comme avec le '[ValidateSet]'.

Mais, je suis quand même obligé d'utiliser un Switch, non ?

... ou alors il faut que j'aille me coucher :unsure:

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

Plus d'informations
il y a 11 ans 3 mois #13486 par Laurent Dardenne
Matthew BETTON écrit:

... ou alors il faut que j'aille me coucher

Il est peut être un peu tot :)

Je pensais à qq chose comme ceci :
[code:1]
Function Set-ZipObjectEncryption{
[CmdletBinding()]
param(
[Ionic.Zip.EncryptionAlgorithm] $DataEncryption,
[Ionic.Zip.ZipFile]$zipObject
)

Write-Debug \&quot;Setting encryption '$DataEncryption' for Zip file archive ...\&quot;
try {
$zipObject.Encryption = $DataEncryption
} catch {
Throw \&quot;An error has occured while setting encryption '$DataEncryption' for Zip file archive : $($_.Exception.Message)\&quot;
}
}
[/code:1]
L'énumération existe déjà dans la DLL, ic il n'est donc pas nécessaire de la créer.
Comme il y a une affectation directe plus besoin du Switch. Effectivement de procéder ainsi impacte le code existant :S

Et pour utiliser avec le pipe, je verrai bien un paramètre -Passthru renvoyant l'objet $ZIP.
Voir concevoir un Set-ZipObject -Encryption ou -Comment et ce autour d'un jeux de paramètre ...

Je crois que je vais lister les besoins que j'ai et ceux que je pourrai ajouter raisonnablement.

Tutoriels PowerShell

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

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