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

Plus d'informations
il y a 11 ans 9 mois #12112 par Matthew BETTON
Richard Lazaro écrit:

Ey je suis pas d'accord, ça fait plus d'un mois que je suis à 50/60h par semaine sans heures sup :p


Pas d'heure sup non plus... Travailler plus pour gagner pareil :P

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 :laugh:

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

Plus d'informations
il y a 11 ans 9 mois #12168 par Laurent Dardenne
Quelques remarques rapides :

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.

Plus d'informations
il y a 11 ans 9 mois #12169 par Laurent Dardenne
Le fichier.

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.

Plus d'informations
il y a 11 ans 9 mois #12170 par Matthew BETTON
Bonsoir,

Merci Laurent.

Je regarde tout ça.

Un début :

La première erreur se trouve ici :

[code:1]
Begin{
if($Encryption -ne \&quot;None\&quot; -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 :silly:

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.

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

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 &lt;&lt;&lt;&lt; $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 \&quot;scinder\&quot; les actions en sous fonctions...

J'ai peut être eu tord (?).

As-tu testé ce cas :
[code:1]
\&quot;C:\temp\&quot; | 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é :p ). 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.

Le problème étant le suivant :
[code:1]
#PS -noprofile
cd \&quot;C:\Dev\dotNetZipLib\Tools\&quot;
ipmo .\IonicZip.psm1
\&quot;$pwd\&quot; | 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 &lt;&lt;&lt;&lt; -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&lt;br&gt;&lt;br&gt;Message édité par: Laurent Dardenne, à: 22/06/12 21:59

[/quote]

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.

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

Un truc marrant sur le sujet

Je l'avais déjà lu dans le bouquin de Payette.
Matthew BETTON écrit:

Toutefois, je reste sceptique.

Oui je comprend.
Matthew BETTON écrit:

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.

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.
Matthew BETTON écrit:

La fonction n'attend pas forcément des objets renvoyés par Get-ChildItem, mais surtout des objets String...

Pour moi ce sera plutot l'inverse, mais j'utiliserais bien les deux types.
Matthew BETTON écrit:

Je l'ai fait sciemment en pensant éviter de dupliquer le code et en voulant \&quot;scinder\&quot; les actions en sous fonctions...
J'ai peut être eu tord (?).

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.
Matthew BETTON écrit:

Un grand merci Laurent !

De rien.
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.

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