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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
[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.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
[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 )
Une solution ? Une bidouille ?
[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.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
Edit : Je précise que maintenant, l'algorythme par défaut est \"None\" (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 \"'$Encryption' n'est pas un algorythme connu pour encrypter les données. Les valeurs possibles sont « $($EnumEncryptions -join \",\") ».\"
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 \"None\") et pas de mot de passe.
Du coup, la condition suivante doit être remplie :
[code:1]if($Encryption -ne \"None\" -and [String]::IsNullOrEmpty($Password)){
Write-Warning \"'$Encryption' a été choisi comme algorythme pour encrypter les données. Un mot de passe doit être spécifié.\"
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.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
- Messages : 968
- Remerciements reçus 0
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 \"Tests et récupération du chemin complet ...\"
try{
if($p -is [string]){
$p = $p
}
elseif($p -is [System.IO.FileInfo] -or $p -is [System.IO.DirectoryInfo]){
$p = $p.FullName
}
else{
throw (\"Le type de l'objet '{0}' n'est pas supporté dans le cadre de la déclaration d'un chemin.\" -f $p.GetType().FullName)
return $null
}
if(-not (Test-Path $p)){
throw (\"Le chemin spécifié n'existe pas : '{0}'.\" -f $p)
return $null
}
$p = (Resolve-Path $p).path
Write-Debug \"Le chemin complet est '$p'\"
return $p
}
catch{
Write-Error \"Une erreur s'est produite lors de la définition du chemin '$p' : $($_.Exception.Message)\"
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Je peux prendre en charge la version Fr.Une des étapes à venir : Repasser toute l'aide en Fr
Matthew BETTON écrit:
Le mieux est d'utiliser des fichiers Maml (xml). Je regarde ça.Peut être voir ensuite pour implémenter les 2 (Fr et En).
Matthew BETTON écrit:
Super !...la fonctionnalité qui permet de gérer les [String] comme les [System.IO.FileInfo], [System.IO.DirectoryInfo] en entrée
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:
Je regarde ça demain ou ce WE.Un avis sur cette première solution ?
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 :
Tous ne sont peut être pas pertinents...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
Je te rassure c'est pas à toi de le faire
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.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)