Question [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
Ey je suis pas d'accord, ça fait plus d'un mois que je suis à 50/60h par semaine sans heures sup
Pas d'heure sup non plus... Travailler plus pour gagner pareil
Sinon, l'étranger ça recrute bien : Canada par exemple ^^
J'en suis revenu quand j'avais 6 mois et ma petite famille n'est pas d'accord...
De ce que j'ai compris Arnaud y est parti.
C'est un beau pays, mais il faut aimer jouer de la pelle en hiver, pour sortir la voiture, et PowerShell n'aide en rien
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6300
- Remerciements reçus 68
Tu peux utiliser $PSScriptRoot au lieu de construire le chemin à l'aide de $MyInvocation
Pour [System.Reflection.Assembly]::LoadFrom($Assembly) il est préférable d'utiliser Add-Type, LoadFrom semble ou a peu d'avenir (deprecated).
Pour la fonction Add-ZipContent, l'attribut suivant :
[code:1]
[ValidateScript({(Test-Path $_)})]
[/code:1]
est inutile si la source provient d'un appel à Dir, car je suppose les fichiers existant. Un paramètre -Verify est peut être préférable. Le choix n'étant pas aisé à faire, mieux vaut le laisser à la charge de l'utilisateur
La difficulté avec les validations au sein de cmdlet/fonction est que chacun refait ce qui à déjà été fait, c'est peut être le prix à payer sous PowerShell...
Pour la construction suivante :
[code:1]
Function Add-ZipContent() {
Param...
[/code:1]
mieux vaut déclarer qu'un seul point d'entrée sur les paramètres, même si le parseur le permet :
[code:1]
Function Add-ZipContent {
Param...
[/code:1]
La V3 permettant d'accéder à l'arbre de syntaxe, on aurait deux points d'entrées. Certes, ceci ne concerne que peu de monde.
J'ai regardé rapidement le code, j'ai remarqué une dépendance de fonction avancées, Add-ZipContent qui appelle Save-ZipFile.
Puisque que tu es dans un module le couplage peut peut-être être supprimé, je te l'accorde c'est un sujet de conception qui nécessite du temps.
Le danger est que si une fonction évolue, tu seras obligé de faire évoluer celles qui en dépendent, et ce en cascade.
Sur un projet, faute de temps, j'ai procédé ainsi, du coup je pense que me souviendrai longtemps de cette leçon.
As-tu testé ce cas :
[code:1]
\"C:\temp\" | Add-ZipContent -Destination C:\Temp\TestIonic.zip
[/code:1]
Est-ce que c'est la librairie qui gére ce cas ?
Pour ce code:
[code:1]
Get-ChildItem D:\sources | ForEach-Object{Add-ZipContent -Source $_.FullName -Destination d:\sources.zip}
[/code:1]
il est peut être possible de procéder ainsi :
[code:1]
Get-ChildItem D:\sources | Add-ZipContent -Source {$_.FullName} -Destination d:\sources.zip
[/code:1]
Mais comme je rencontre un problème d'utilisation je n'ai pas validé ce point.
Le problème étant le suivant :
[code:1]
#PS -noprofile
cd \"C:\Dev\dotNetZipLib\Tools\"
ipmo .\IonicZip.psm1
\"$pwd\" | Add-ZipContent -Destination C:\Temp\TestIonic.zip
# AVERTISSEMENT : '-Password' parameter is a mandatory parameter when '-Encryption' parameter is used.
# Add-DataToZip : An error has occured while adding direcotry 'C:\Dev\dotNetZipLib\Tools' to Zip file :
# Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
# Au niveau de C:\Dev\dotNetZipLib\Tools\IonicZip.psm1 : 520 Caractère : 35
# + if(-not (Add-DataToZip <<<< -Data ((Resolve-Path $Item).Path) -zipObject $objZip -Update:$Update)){
#...
$Error.clone()|Export-Clixml c:\temp\error.xml
[/code:1]
Je te joint le fichier d'erreur, là je n'ai pas le temps de débugger, si toutefois c'est nécessaire, car c'est peut être moi qui n'est pas compris comment ça fonctionne.
Ceci dit quelques démos, en plus de l'aide en ligne, ne seraient pas de trop.
Testé sous Windows Seven 64 bits Fr, PS v2 Fr
[edit]
coquilles<br><br>Message édité par: Laurent Dardenne, à: 22/06/12 21:59
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6300
- Remerciements reçus 68
La pièce jointe Error.txt est absente ou indisponible
Tutoriels PowerShell
Pièces jointes :
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
Merci Laurent.
Je regarde tout ça.
Un début :
La première erreur se trouve ici :
[code:1]
Begin{
if($Encryption -ne \"None\" -and -not $Password){[/code:1]
J'ai modifié mon code en cours de route en initialisant par défaut $Encryption à $Null, du coup, si le paramétre n'est pas spécifié, tout comme le password, la condition est toujours vraie
Je continue... et je reviens !<br><br>Message édité par: Matthew BETTON, à: 22/06/12 21:41
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
Quelques remarques rapides :
Tu peux utiliser $PSScriptRoot au lieu de construire le chemin à l'aide de $MyInvocation
Ok. Un truc marrant sur le sujet : connect.microsoft.com/PowerShell/feedbac...y-works-with-modules
Pour [System.Reflection.Assembly]::LoadFrom($Assembly) il est préférable d'utiliser Add-Type, LoadFrom semble ou a peu d'avenir (deprecated).
Ok, c'est corrigé.
Pour la fonction Add-ZipContent, l'attribut suivant :
[code:1]
[ValidateScript({(Test-Path $_)})]
[/code:1]
est inutile si la source provient d'un appel à Dir, car je suppose les fichiers existant. Un paramètre -Verify est peut être préférable. Le choix n'étant pas aisé à faire, mieux vaut le laisser à la charge de l'utilisateur
La difficulté avec les validations au sein de cmdlet/fonction est que chacun refait ce qui à déjà été fait, c'est peut être le prix à payer sous PowerShell...
Ok, j'ai fait la modif. Toutefois, je reste sceptique. Si je ne spécifie pas -Verify, du coup, j'ai un message d'erreur qui n'indique pas forcément la cause du problème. La fonction n'attend pas forcément des objets renvoyés par Get-ChildItem, mais surtout des objets String...
[code:1]
Test-Path : Impossible de lier l'argument au paramètre « Path », car il s'agit d'une chaîne vide.
Au niveau de C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ioniczip\ioniczip.psm1 : 91 Caractère : 14
+ if(Test-Path <<<< $Data -PathType Container){
+ CategoryInfo : InvalidData: (:«») [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand
[/code:1]
Pour la construction suivante :
[code:1]
Function Add-ZipContent() {
Param...
[/code:1]
mieux vaut déclarer qu'un seul point d'entrée sur les paramètres, même si le parseur le permet :
[code:1]
Function Add-ZipContent {
Param...
[/code:1]
La V3 permettant d'accéder à l'arbre de syntaxe, on aurait deux points d'entrées. Certes, ceci ne concerne que peu de monde.
Intéressant, je note et j'ai modifié le code.
J'ai regardé rapidement le code, j'ai remarqué une dépendance de fonction avancées, Add-ZipContent qui appelle Save-ZipFile.
Puisque que tu es dans un module le couplage peut peut-être être supprimé, je te l'accorde c'est un sujet de conception qui nécessite du temps.
Le danger est que si une fonction évolue, tu seras obligé de faire évoluer celles qui en dépendent, et ce en cascade.
Sur un projet, faute de temps, j'ai procédé ainsi, du coup je pense que me souviendrai longtemps de cette leçon.
Add-ZipContent appelle plusieurs fonctions : Save-ZipFile, Add-DataToZip, Set-ZipObjectEncryption, Set-ZipObjectPassword.
Ces mêmes fonctions sont appelées par Set-ZipContent.
Je l'ai fait sciemment en pensant éviter de dupliquer le code et en voulant \"scinder\" les actions en sous fonctions...
J'ai peut être eu tord (?).
As-tu testé ce cas :
[code:1]
\"C:\temp\" | Add-ZipContent -Destination C:\Temp\TestIonic.zip
[/code:1]
Est-ce que c'est la librairie qui gére ce cas ?
Oui, cela fonctionne (enfin, après la correction de la coquille que tu as soulevé ). Cette action se trouve dans les Command Based Help. C'est la fonction 'Add-DataToZip' qui gère ça. La DLL offre de nombreuses méthodes, et je me suis focalisé sur une façon de faire. La DLL offre des tonnes d'autres solutions...
Pour ce code:
[code:1]
Get-ChildItem D:\sources | ForEach-Object{Add-ZipContent -Source $_.FullName -Destination d:\sources.zip}
[/code:1]
il est peut être possible de procéder ainsi :
[code:1]
Get-ChildItem D:\sources | Add-ZipContent -Source {$_.FullName} -Destination d:\sources.zip
[/code:1]
Mais comme je rencontre un problème d'utilisation je n'ai pas validé ce point.
Effectivement, après correction de la coquille, cette solution fonctionne.
[/quote]Le problème étant le suivant :
[code:1]
#PS -noprofile
cd \"C:\Dev\dotNetZipLib\Tools\"
ipmo .\IonicZip.psm1
\"$pwd\" | Add-ZipContent -Destination C:\Temp\TestIonic.zip
# AVERTISSEMENT : '-Password' parameter is a mandatory parameter when '-Encryption' parameter is used.
# Add-DataToZip : An error has occured while adding direcotry 'C:\Dev\dotNetZipLib\Tools' to Zip file :
# Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
# Au niveau de C:\Dev\dotNetZipLib\Tools\IonicZip.psm1 : 520 Caractère : 35
# + if(-not (Add-DataToZip <<<< -Data ((Resolve-Path $Item).Path) -zipObject $objZip -Update:$Update)){
#...
$Error.clone()|Export-Clixml c:\temp\error.xml
[/code:1]
Je te joint le fichier d'erreur, là je n'ai pas le temps de débugger, si toutefois c'est nécessaire, car c'est peut être moi qui n'est pas compris comment ça fonctionne.
Ceci dit quelques démos, en plus de l'aide en ligne, ne seraient pas de trop.
Testé sous Windows Seven 64 bits Fr, PS v2 Fr
[edit]
coquilles<br><br>Message édité par: Laurent Dardenne, à: 22/06/12 21:59
Coquille corrigée, donc
Un grand merci Laurent !
Je mets à jour le code dans le poste d'origine (je l'indique dans le message).
Message édité par: Matthew BETTON, à: 22/06/12 22:27<br><br>Message édité par: Matthew BETTON, à: 22/06/12 22:31
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6300
- Remerciements reçus 68
Je l'avais déjà lu dans le bouquin de Payette.Un truc marrant sur le sujet
Matthew BETTON écrit:
Oui je comprend.Toutefois, je reste sceptique.
Matthew BETTON écrit:
Peut être en trappant l'exception si le fichier n'existe pas et déclencher un Write-Error tout en s'appuyant sur le comportement de $ErroActionPreference.Si je ne spécifie pas -Verify, du coup, j'ai un message d'erreur qui n'indique pas forcément la cause du problème.
Matthew BETTON écrit:
Pour moi ce sera plutot l'inverse, mais j'utiliserais bien les deux types.La fonction n'attend pas forcément des objets renvoyés par Get-ChildItem, mais surtout des objets String...
Matthew BETTON écrit:
Non tu as raison, mais le fait de document une fonction interne me laissait penser qu'elle était exportée, j'ai mal lu la déclaration d'Export-ModuleMember.Je l'ai fait sciemment en pensant éviter de dupliquer le code et en voulant \"scinder\" les actions en sous fonctions...
J'ai peut être eu tord (?).
Matthew BETTON écrit:
De rien.Un grand merci Laurent !
J'essaierais de tester les autres fonction prochainement, il reste un autre point à améliorer, en tout cas pour mes besoins, à savoir la localisation des dlls IOnic dans le GAC. Ce qui suppose une manifest de module, à vérifier.
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)