Question
Compression Gzip .NET
- Jacques Barathon
- Hors Ligne
- Administrateur
-
- Messages : 576
- Remerciements reçus 0
Pour l'instant j'ai vu qu'on peut énumérer les fichiers d'une dossier compressé, et que chaque fichier peut être manipulé via des verbes (équivalents aux commandes disponibles dans le menu contextuel) :
[code:1]
PS> $shell = new-object -com shell.application
PS> $zip = $shell.namespace(\"c:\temp\monarchive.zip\"«»)
PS> $zip.items()
... # liste des fichiers contenus dans monarchive.zip
PS> $zip.parsename(\"monfichier.txt\"«»)
... # retourne le fichier correspondant au nom
PS> $monfichier = $zip.parsename(\"monfichier.txt\"«»)
PS> $monfichier.verbs()
Application Parent Name
----
&Open
Cu&t
&Copy
&Delete
P&roperties
PS> $monfichier.invokeverb(\"Delete\"«») # pouf! supprimé!
[/code:1]
De la même façon qu'on peut supprimer un fichier de l'archive, on devrait pouvoir le copier dans un autre répertoire.
Problème: le verbe \"Copy\" copie le fichier dans le presse-papiers.
Solution: utiliser la classe System.Windows.Forms.Clipboard pour manipuler le presse-papiers.
Bon, déjà il faut démarrer PowerShell en mode STA (uniquement disponible avec la v2 CTP) pour pouvoir manipuler cette classe. Pour ça, exécuter:
[code:1]
PS> powershell -sta
[/code:1]
A partir de là on peut travailler sur le presse-papiers:
[code:1]
PS> $null = [reflection.assembly]::LoadWithPartialName(\"system.windows.forms\"«»)
PS> $shell = new-object -com shell.application
PS> $zip = $shell.namespace(\"c:\temp\monarchive.zip\"«»)
PS> $file = $zip.parsename(\"monfichier.txt\"«»)
PS> $file.invokeverb(\"Copy\"«»)
PS> $clip = [windows.forms.clipboard]::GetDataObject()
PS> $clip.GetFormats()
Shell IDList Array
FileGroupDescriptorW
FileContents
[/code:1]
Voilà, j'en suis là. Si le contenu du presse-papiers était du simple texte ou même une image, je saurais récupérer son contenu, mais là je bloque.
J'essaierai de m'y remettre en fin de journée, pas sûr que j'aie le temps. N'hésitez pas à poursuivre la discussion si vous pouvez avancer (ou si vous trouvez une autre piste).
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Pour GetDataObject je regarde ça, je dois avoir qq chose sur le sujet.N'hésitez pas à poursuivre la discussion si vous pouvez avancer (ou si vous trouvez une autre piste).
Ensuite vu la nouvelle fonctionnalité m'est avis que la DLL C# dédiée à la compression faciliterait le développement de ce script.
Comme le script doit être déployé sur le serveur dans un répertoire dédié je suppose, lui associer une DLL, dans ce même répertoire n'a pas d'impact majeur sur la configuration du serveur.
Et puis la maintenance de ce script s'en trouvera facilité.
De mon coté j'ai essayé avec le premier script, basé sur la compression dispos dans le framework, mais sur mon poste le script d'Arnaud compresse bien le fichier mais pas en une archive valide
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
- Messages : 576
- Remerciements reçus 0
Perso je n'ai pas utilisé le script d'Arnaud mais une variante de celui cité par GirardJames :
[code:1]
filter ConvertTo-Zip
{
param([string]$zipfilename)
begin
{
if(-not (test-path($zipfilename)))
{
set-content $zipfilename (\"PK\" + [char]5 + [char]6 + (\"$([char]0)\" * 18))
(dir $zipfilename).IsReadOnly = $false
}
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
}
process
{
$zipPackage.CopyHere($_.FullName)
}
}
[/code:1]
Pour rendre à César ce qui est à César, il me semble que ce script a été publié la première fois par MOW, grand MVP PowerShell devant l'Eternel et également célèbre sous le pseudo \"The PowerShell Guy\". Le script devait s'appeler \"out-zip\" à l'époque.
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
ICSharpCode.SharpZipLib.dll , elle est utilisée par les cmdlet de PSCX (PowerShell Community Extensions).C'est quoi la DLL C# en question?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Girard James
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 26
- Remerciements reçus 0
Après quelques tests et recherche, j'ai en local un executable qui me permet de zipper (Zip.exe et Unzip.exe)
C'est un petit éxecutable fournit avec Oracle. (en cherchant dans le path du CMD).
Ma question serait de pouvoir exploiter cet exec dans powershell sur une autre machine.
C:\Documents and Settings\user>zip
Copyright (C) 1990-1996 Mark Adler, Richard B. Wales, Jean-loup Gailly
Onno van der Linden and Kai Uwe Rommel. Type 'zip -L' for the software License.
Zip 2.1 (April 27th 1996). Usage:
zip [-options] [-b path] [-t mmddyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete files)
-k force MSDOS (8+3) file names -g allow growing existing zipfile
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-b use \"path\" for temp file -t only do files after \"mmddyy\"
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zip file prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-$ include volume label -S include system and hidden files
-h show this help -n don't compress these suffixes
Il existe également une autre executable nomé unzip.exe
Ensuite, que dois-je faire pour faire fonctionner cet exec sur un autre environnement avec PS?
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Compression Gzip .NET