Question [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)
- SiSMik
- Hors Ligne
- Membre platinium
- Messages : 492
- Remerciements reçus 0
J'ai pas testé ce module, actuellement je bidouille avec les objets COM pour unzip mes fichiers, et j'ai un truc qui me manque cruellement, peut être ce module avec ionic le fait.
En fait dans winrar (par exemple) il est possible de déziper une archive avec l'action \"Extraire ici\" ce qui ne rajoute pas un dossier enfant. C'est possible ça ?
(Pas sur d'avoir été assez clair)
Bonne soirée !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Je pense, l'extraction se fait dans le répertoire indiqué, reste à déterminier comment gérer les fichiers existant.En fait dans winrar (par exemple) il est possible de déziper une archive avec l'action \"Extraire ici\" ce qui ne rajoute pas un dossier enfant. C'est possible ça ?
Je pensais justement orienter le code de ce module pour faciliter ce type d'usage via l'exploreur. Mais ça c'est un autre développement , créer des entrées de menu contextuel via PS.
Le fichier joint contient un exemple codé en Delphi, il reste à enregistrer la dll avec Regsrv)
La pièce jointe tools.zip 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
Laurent Dardenne écrit:
Je peux prendre en charge la version Fr.
Le mieux est d'utiliser des fichiers Maml (xml). Je regarde ça.
Ok
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.
'Add-ZipContent' prend déjà en charge le pipeline... Mais pas de 'Set-ZipContent'.
Je réfléchis (depuis quelques temps) à la justification de l'existance de Set-ZipContent.
Un Set-ZipContent c'est un Add-ZipContent lorsque l'archive cible n'existe pas encore.
Seule cette fonctionnalité n'est pas reprise dans le code de 'Add-ZipContent' :
[code:1]Set-ZipContent -Source \"D:\File.dat\" -Destination \"D:\MyZipFile.zip\" -Force[/code:1]
=> Indique que si l'archive existe déjà, elle est écrasée.
Si 'Set-ZipContent' est finalement supprimée, il faudra alors se poser la question du nommage de la Cmdlet 'Add-ZipContent'.
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.
Ok pas de souci, merci.
Tous ne sont peut être pas pertinents...
Je te rassure c'est pas à toi de le faire
Je participe et je suis content
Pour certaines fonctionnalités, elles sont déjà présentes dans le module :
Add-Zipcontent
Créer une archive à partir :
-d'un fichier
-de + fichiers
-d'un répertoire
-de + répertoires
-d'une liste de fichiers ('multidrives')
Get-ZipContent
Afficher le contenu de l'archive
Pour cette fonctionnalité : Extraire une entrée (fichier/répertoire) d'une archive
L'idée est de passer par Get-ZipContent sans le paramètre '-List' => Dans ce cas, ce sont des objets [Ionic.Zip.ZipEntry] qui sont renvoyés.
Et là c'est youpi, parce que cet objet dispose de la méthode 'extract()'.
@ +
Matthew
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
benduru écrit:
Je pense, l'extraction se fait dans le répertoire indiqué, reste à déterminier comment gérer les fichiers existant.En fait dans winrar (par exemple) il est possible de déziper une archive avec l'action \"Extraire ici\" ce qui ne rajoute pas un dossier enfant. C'est possible ça ?
Oui c'est déjà le cas : c'est le paramètre '-Destination' qui définie le chemin où seront décompressées les données. Un répertoire parent portant le nom de l'archive n'est pas généré. Dans ce dernier cas, c'est plutôt à celui qui utilises la Cmdlet Expand-Zip de créer ce répertoire avant extraction...
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
- Messages : 492
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Oui sur la forme, non sur le fond, car à la lecture de la doc il existe qq régles de comportement à respecter.Une solution ?
Ceci dit, pour la gestion de l'énumération il faut coupler le paramètre avec des attributs :
[code:1]
[Parameter(Mandatory=$true)]
[ValidateNotNull()]
[Ionic.Zip.EncryptionAlgorithm]$DataEncryption,
[/code:1]
Ainsi on est assuré d'avoir une valeur différente de nulle.
Et si on souhaite respecter le comportement on doit procéder autremement. En même temps manquant de recul sur la connaissance et l'usage de cette librairie je reste prudent sur cette appproche :
[code:1]
Function Set-ZipObjectEncryption {
# .ExternalHelp IonicZip-Help.xml
[CmdletBinding(DefaultParameterSetName = \"Set\"«»)]
param(
[Parameter(Position=0,Mandatory=$true)]
[ValidateNotNull()]
[Ionic.Zip.ZipFile]$zipObject,
[Parameter(Position=1,ParameterSetName=\"Set\"«»)]
[Ionic.Zip.EncryptionAlgorithm]$DataEncryption,
[Parameter(Position=2,ParameterSetName=\"Set\"«»)]
[String]$Password,
[Parameter(ParameterSetName=\"Reset\"«»)]
[switch] $Reset
)
Write-Debug \"Setting encryption for Zip file archive $($zipObject.Name)\"
try {
if ($Reset)
{ $zipObject.Password = $null } # -> Encryption = None
else
{
$isPwdValid= [string]::IsNullOrEmpty($Password) -eq $false
$isEncryptionValid=$DataEncryption -ne $null
If ($isPwdValid -and -not $isEncryptionValid)
{
$zipObject.Encryption = \"Weak\"
$zipObject.Password = $Password
}
elseif (-not $isPwdValid -and -not $isEncryptionValid)
{ $zipObject.Password = $null } #Encryption = None -> Reset
elseif ($DataEncryption -ne \"None\"«»)
{
if ($isPwdValid)
{ Throw \"The parameter password is not valid for the value of DataEncryption : $DataEncryption.\"}
$zipObject.Encryption = $DataEncryption
$zipObject.Password = $Password
}
else
{ $zipObject.Password = $null } #Encryption = None -> Reset
}
}
catch{
throw \"An error has occured while setting encryption for Zip file archive $($zipObject.Name) : $($_.Exception.Message)\"
}
Return $zipObject
}#Set-ZipObjectEncryption
[/code:1]
A tester.
Matthew BETTON écrit:
Par expérience, dans ce cas faire simple en utilisant uniquement le Cmdlet 'Export-ModuleMember'.Est-ce inadapté, lorsqu'on utilise un Manifeste, de continuer à utiliser la Cmdlet 'Export-ModuleMember' ?
Matthew BETTON écrit:
Il faut propager l'usage de l'énumération sur le paramètre -Encryption de la méthode Set-ZipContent.Dans la console, on perd la fonctionnalité d'auto complétion des valeurs possibles pour le paramètre '-Encryption'
Matthew BETTON écrit:
Le test suivant :Un avis sur cette première solution ?
[code:1]
if(-not (Test-Path $p)){
[/code:1]
me semble suffisant car la liaison de paramètre transforme l'objet en string :
[code:1]
$S=Get-Service
Trace-Command ParameterBinding {Test-Path $s[0]} -PSHost
[/code:1]
Donc, laisser PS faire le boulot, sous réserve de connaitre un peu comment il le fait et ne pas oublier les breaking change si on cible la V3...
Et pour ce code :
[code:1]
elseif($p -is [System.IO.FileInfo] -or $p -is [System.IO.DirectoryInfo]){
[/code:1]
Il faut rechercher la classe ancêtre commune (approche POO) :
[code:1]
$f=dir
$f[0]
$f[0].PSObject.typenames
$f[-1].PSObject.typenames
[/code:1]
Ensuite utiliser une méthode de la classe Type:
[code:1]
$F[0].GetType().Fullname
if ($F[0].GetType().IsSubclassOf([System.IO.FileSystemInfo])
{\"Ok\"}
else {\"Nok\"}
$F[-1].GetType().Fullname
if ($F[-1].GetType().IsSubclassOf([System.IO.FileSystemInfo])
{\"Ok\"}
else {\"Nok\"}
[/code:1]
Matthew BETTON écrit:
C'est, pour moi, un peu prématuré de répondre.Je réfléchis (depuis quelques temps) à la justification de l'existance de Set-ZipContent.
Matthew BETTON écrit:
New et Add ?Si 'Set-ZipContent' est finalement supprimée, il faudra alors se poser la question du nommage de la Cmdlet 'Add-ZipContent'.
Il faut distinguer l'usage et l'implémentation.
Matthew BETTON écrit:
Ici, et comme dit précédemment, l'usage doit primer. L'utilisateur, si j'ai bien compris, n'a pas à connaitre, tant que faire ce peut, l'implémentation de l'objet.Et là c'est youpi, parce que cet objet dispose de la méthode 'extract()'.
Et si besoin, ce serait pour un usage avancé ou une impossibilté de simplifier.
Pourquoi ne pas envisager un :
[code:1]
Extract-Zip *.ps1,*.ps1xml
[/code:1]
Aujourd'hui je ne pense pas que la difficulté/questionnement soit dans l'implémentation de ce Wrapper, mais dans l'articulation (+- les combinaisons) des fonctions avancées répondant aux fonctionnalités proposées.
Questionnement rencontré lors de l'écriture de ce Wrapper .
Il est possible de concevoir au delà des besoins énoncés, sans pour autant tout implémenter.
Je trouve ce projet très intéressant et pour qu'il le reste je pense qu'il est nécessaire de revoir cette base, ce point étant renforcé par tes dernières interrogations. Et mes remarques précédentes ont peut être induit cette situation...
Dans un premier temps, un simple write-host \"Je fais telle action\" suffira, je pense, pour valider l'articulation. Le plus important, il me semble, est le \"parameter binding\", la liaison de paramètres, que j'appelle ici 'articulation'.
Je suis donc plus orienté aujourd'hui sur le quoi proposer comme service autour de la manipulation d'une archive que sur comment le faire. Car sur ce dernier point, et comme je te l'ai dit, je trouve que la DLL est vraiment bien conçue.
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)