Question [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Pour préciser l'intention.Pourquoi utiliser -ne $null ?
benduru écrit:
Je suis d'accord, mais ceci me rend prudent.j'aurais plutôt fait comme ça
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
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
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.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
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(\"PkzipWeak\",\"WinZipAes128\",\"WinZipAes256\",\"Unsupported\"«»)]
[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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
J'ai flambé la mienne, je ne me souviens plus pourquoi...(pas trop de \"dinde au whisky\" !).
Matthew BETTON écrit:
Eh oui, seul c'est bien, à deux c'est mieux et à plusieurs c'est bien meilleurCela fait donc plaisirs de voir une nouvelle fois les bienfaits d'une communauté : Partager, Comprendre et Apprendre
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:
Au contraire ton choix était cohérent dans la version citée. Je posais cette question en cas d'ajouts/modification du code existant.Comme tu le dis, c'est un choix, et ta remarque me montre que je n'ai pas fait le bon.
Matthew BETTON écrit:
Oui c'est son objectif. Pour un usage communautaire je ne juge pas utile de consulter la licence.Une question : Peut on intégrer dans le ZIP partagé ici, une DLL développée par une autre communauté (Codeplex) ?
Matthew BETTON écrit:
Je ne sais pas, là tu me poses une colle.Penses-tu qu'il faille (?*) :
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:
Oui, je comprends. J'imaginais de rendre publique cette fonction. Il est donc normal que l'existant ne me convienne pas.J'avais placé ce code, pour éviter l'utilisation d'une encryption sans qu'un mot de passe ne soit précisé :
L'autre difficulté est de déterminer qui fait ce test, la fonction appelante ou celle appelée ?
Matthew BETTON écrit:
Je prends !Why not ? Si quelqu'un dans la salle dispose de temps et se propose
Matthew BETTON écrit:
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.je termine les tests
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:
Je suis d'accord.Si nous le faisons, cela remet en question l'existence du paramètre 'Encryption' de 'Set-ZipContent' et 'Add-ZipContent' :
Mais je ne comprend pas pourquoi à partir de l'énumération EncryptionAlgorithm, tu as construit un sous ensemble (\"PkzipWeak\",\"WinZipAes128\",\"WinZipAes256\",\"Unsupported\").
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.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
Je suis d'accord.
Mais je ne comprend pas pourquoi à partir de l'énumération EncryptionAlgorithm, tu as construit un sous ensemble (\"PkzipWeak\",\"WinZipAes128\",\"WinZipAes256\",\"Unsupported\").
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=@(\"None\",\"PkzipWeak\",\"WinZipAes128\",\"WinZipAes256\",\"Unsupported\"«»)
New-Enum $EncryptionEnums
[EncryptionAlgorithm]$Encryption = \"PkzipWeak\"
$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
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Il est peut être un peu tot... ou alors il faut que j'aille me coucher
Je pensais à qq chose comme ceci :
[code:1]
Function Set-ZipObjectEncryption{
[CmdletBinding()]
param(
[Ionic.Zip.EncryptionAlgorithm] $DataEncryption,
[Ionic.Zip.ZipFile]$zipObject
)
Write-Debug \"Setting encryption '$DataEncryption' for Zip file archive ...\"
try {
$zipObject.Encryption = $DataEncryption
} catch {
Throw \"An error has occured while setting encryption '$DataEncryption' for Zip file archive : $($_.Exception.Message)\"
}
}
[/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
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.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)