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

Plus d'informations
il y a 12 ans 2 semaines #13487 par Matthew BETTON
C'est cette partie là que je ne comprends pas :

Laurent Dardenne écrit:

L'énumération existe déjà dans la DLL, ic il n'est donc pas nécessaire de la créer.


Je ne l'ai pas trouvé... ou pas trouvé comment faire pour énumérer les valeurs possibles de 'Ionic.Zip.EncryptionAlgorithm'. Je retourne donc lire la doc ...

Pour le reste, c'est OK.

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

Plus d'informations
il y a 12 ans 2 semaines #13488 par Laurent Dardenne
Utilise les méthodes statiques de la classe Enum :
[code:1]

[System.Enum]::GetNames([Ionic.Zip.EncryptionAlgorithm])

[System.Enum]::GetValues([Ionic.Zip.EncryptionAlgorithm])| % {$_ -as [int]}
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 12 ans 2 semaines #13491 par Matthew BETTON

[code:1][System.Enum]::GetValues([Ionic.Zip.EncryptionAlgorithm])[/code:1]


... heu... oui, là je crois qu'il est temps que j'aille me coucher ! (Disons que je débute OK :side: )

Une solution ? Une bidouille ? :P

[code:1]Function Set-ZipObjectEncryption {
<#
.Synopsis
This private function sets the Encryption Property on a Ionic.Zip.ZipFile object.
.Example
Set-ZipObjectEncryption -Encryption \"WinZipAes128\" -zipObject $objZip

This command sets the \"WinZipAes128\" encryption algorythm on the '$objzip' object.
.Parameter zipObject
A 'Ionic.Zip.ZipFile' object.
.Parameter Encryption
An encryption algorythm : None, PkzipWeak, WinZipAes128, WinZipAes256 or Unsupported.
.Outputs
$False if an error occured.
$True if 'Ionic.Zip.ZipFile' object has been successfuly set.
.Link
dotnetzip.herobo.com/DNZHelp/html/5fd950...287-4d941d5a2565.htm
#>
[CmdletBinding()]
param(
[Ionic.Zip.EncryptionAlgorithm]$DataEncryption,
[Ionic.Zip.ZipFile]$zipObject
)

if($DataEncryption){
Write-Debug \"Setting encryption '$DataEncryption' for Zip file archive ...\"
try{
$zipObject.Encryption = $DataEncryption
}
catch{
Write-Error \"An error has occured while setting encryption '$DataEncryption' for Zip file archive : $($_.Exception.Message)\"
return $false
}
}
return $true
}


Function Test-Encryption {

param(
[String]$Encryption
)

if(([Ionic.Zip.EncryptionAlgorithm]::«»($Encryption)) -eq $null){
Write-Warning \"'$Encryption' n'est pas un algorythme connu pour encrypter les données. Les valeurs possibles sont « $([System.Enum]::GetValues([Ionic.Zip.EncryptionAlgorithm])) ».\"
return $null
}


$zipObject = new-object Ionic.Zip.ZipFile

Set-ZipObjectEncryption -DataEncryption ([Ionic.Zip.EncryptionAlgorithm]::«»($Encryption)) -zipObject $zipObject

#
# Traitement
#

$zipObject.dispose()
}


Test-Encryption 'None'
# True

Test-Encryption 'toto'
# AVERTISSEMENT:'toto' n'est pas un algorythme connu pour encrypter les données. Les valeurs possibles sont « None PkzipWeak WinZipAes128 WinZipAes256 Unsupported ».

Test-Encryption 'WinZipAes256'
# True[/code:1]<br><br>Message édité par: Matthew BETTON, à: 30/12/12 23:13

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

Plus d'informations
il y a 12 ans 2 semaines #13493 par Matthew BETTON
Ma solution précédente ne fonctionnera pas dans le contexte : si l'encryption n'est pas spécifiée, la variable $encryption sera null ...

Edit : Je précise que maintenant, l'algorythme par défaut est \&quot;None\&quot; (donc, par défaut, pas d'encryption).

Par contre, avec cette solution, c'est OK :

[code:1]$EnumEncryptions = ([System.Enum]::GetValues([Ionic.Zip.EncryptionAlgorithm]) | foreach-object{$_.ToString()})
if($EnumEncryptions -notcontains $Encryption){
Write-Warning \&quot;'$Encryption' n'est pas un algorythme connu pour encrypter les données. Les valeurs possibles sont « $($EnumEncryptions -join \&quot;,\&quot;) ».\&quot;
break
}
[/code:1]
puis :

[code:1] Set-ZipObjectEncryption -DataEncryption ([Ionic.Zip.EncryptionAlgorithm]::«»($Encryption)) -zipObject $zipObject[/code:1]

Edit2 : J'ai testé. On a bien une erreur si on précise une méthode d'encryption (autre que \&quot;None\&quot;) et pas de mot de passe.

Du coup, la condition suivante doit être remplie :

[code:1]if($Encryption -ne \&quot;None\&quot; -and [String]::IsNullOrEmpty($Password)){
Write-Warning \&quot;'$Encryption' a été choisi comme algorythme pour encrypter les données. Un mot de passe doit être spécifié.\&quot;
break
}[/code:1]

On peut remplacer les mêmes sources dans une fichier zip déjà existant, dans ce cas il faut utiliser le paramètre '-Update' de 'Add-ZipContent'. On peut aussi les remplacer en précisant un algorythme d'encryption, toujours via '-Update' et bien entendu en précisant les paramètres '-Encryption' + '-Password'.<br><br>Message édité par: Matthew BETTON, à: 1/01/13 20:38

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

Plus d'informations
il y a 12 ans 2 semaines #13514 par Matthew BETTON
Bonsoir,

J'avance sur le sujet.

Une des étapes à venir : Repasser toute l'aide en Fr (la nouvelle fonction 'ConvertTo-Sfx' proposée par Laurent est en Fr et je pense que cela sera le mieux. Le mix n'est pas top !). Peut être voir ensuite pour implémenter les 2 (Fr et En).

Pour ce qui concerne les fonctions privées et publiques : Via le Manifeste, nous ne pouvons pas nommer chaque fonction exportée. Nous ne pouvons le faire qu'à l'aide d'un filtre. Je trouve, dans ce contexte, que cela ne simplifie rien et la tâche qui consiste à renommer les fonctions est ardue. Est-ce inadapté, lorsqu'on utilise un Manifeste, de continuer à utiliser la Cmdlet 'Export-ModuleMember' ?

Le 'ValidateSet' n'est plus utilisé dans le code. Toutefois, j'ai une remarque à ce sujet. Dans la console, on perd la fonctionnalité d'auto complétion des valeurs possibles pour le paramètre '-Encryption' (avec l'utilisation de la touche Tab).

Aussi, je travaille actuellement sur la fonctionnalité qui permet de gérer les [String] comme les [System.IO.FileInfo], [System.IO.DirectoryInfo] en entrée (Laurent avait soulevé l'idée dans un commentaire précédent).

Un avis sur cette première solution ?

[code:1]Function Get-PathFullName {
[CmdletBinding()]
param(
[parameter(Position=0,Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$Path
)

Process{
Foreach($p in $Path){
Write-Debug \&quot;Tests et récupération du chemin complet ...\&quot;
try{
if($p -is [string]){
$p = $p
}
elseif($p -is [System.IO.FileInfo] -or $p -is [System.IO.DirectoryInfo]){
$p = $p.FullName
}
else{
throw (\&quot;Le type de l'objet '{0}' n'est pas supporté dans le cadre de la déclaration d'un chemin.\&quot; -f $p.GetType().FullName)
return $null
}

if(-not (Test-Path $p)){
throw (\&quot;Le chemin spécifié n'existe pas : '{0}'.\&quot; -f $p)
return $null
}

$p = (Resolve-Path $p).path

Write-Debug \&quot;Le chemin complet est '$p'\&quot;
return $p
}
catch{
Write-Error \&quot;Une erreur s'est produite lors de la définition du chemin '$p' : $($_.Exception.Message)\&quot;
return $null
}
}
}
}
cls
Get-PathFullName D:\
Get-PathFullName D:\temp
Get-PathFullName C:\toto
Get-PathFullName tutu
Get-PathFullName D:\tutu.txt
Get-PathFullName 1234
Get-PathFullName .\
Get-ChildItem D:\test | Get-PathFullName[/code:1]

L'idée est ensuite que la valeur du paramètre '-Source' n'est pas typée. C'est cette fonction (privée au module) qui permet de définir le chemin complet de chaque source...

@ +

Matthew<br><br>Message édité par: Matthew BETTON, à: 3/01/13 21:10

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

Plus d'informations
il y a 12 ans 2 semaines #13516 par Laurent Dardenne
Matthew BETTON écrit:

Une des étapes à venir : Repasser toute l'aide en Fr

Je peux prendre en charge la version Fr.
Matthew BETTON écrit:

Peut être voir ensuite pour implémenter les 2 (Fr et En).

Le mieux est d'utiliser des fichiers Maml (xml). Je regarde ça.
Matthew BETTON écrit:

...la fonctionnalité qui permet de gérer les [String] comme les [System.IO.FileInfo], [System.IO.DirectoryInfo] en entrée

Super !
Je réfléchissais à modifier le prg console pour prendre en charge le pipeline, c'est, pour un usage simple, un truc qui, je trouve, manque actuellement.

Je pensais aussi créer un provider, mais je ne suis pas certains que cela soit pratique...
Matthew BETTON écrit:

Un avis sur cette première solution ?

Je regarde ça demain ou ce WE.
J'ai aussi 1 ou 2 remarques sur tes posts précédents, mais je n'ai pas pris le temps d'y répondre.

Par contre j'ai recensé ces besoins :

Créer une archive à partir :
-d'un fichier
-de + fichiers
-d'un répertoire
-de + répertoires
-d'une liste de fichiers ('multidrives')
-d'un filtre
-de + filtres ?

Afficher le contenu de l'archive

Extraire une entrée (fichier/répertoire) d'une archive
Update d'une archive

Sur une archive existante, ajouter :
- un commentaire
- un password
- un fichier
- des fichiers
- un répertoire
- des répertoires
-d'une liste de fichiers ('multidrives')
-les fichiers issus d'un filtre

Sur une archive existante, supprimer :
- un commentaire
- un password
- un fichier
- des fichiers
- un répertoire
- des répertoires
-les fichiers issus d'un filtre

Créer une archive avec des fichiers limités à une taille donnée (Split-Zip)
Créer une archive autoextractible

Tous ne sont peut être pas pertinents...
Je te rassure c'est pas à toi de le faire :lol:

Par contre le coeur du module devrait permettre ces implémentations sans avoir à refondre ce que tu es en train de modifier.

Si tu veux un coup de main, le mieux serait d'utiliser un outil dans ce genre là ou codeplex.

En même temps je ne tiens pas à t'ammener là où tu n'a pas envie d'aller :)
Tu as certainement d'autres choses à faire.<br><br>Message édité par: Laurent Dardenne, à: 3/01/13 21:55

Tutoriels PowerShell

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

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