Zip de fichier et CopyHere

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Dans le cadre d’un projet, je dois utiliser Powershell (pas le choix de la techno) pour manipuler des fichiers. Pour faire court, je dois récupérer une archive (zip), la désarchiver, modifier des XML puis réarchiver le tout sous un nouveau nom.

N’étant pas du tout expert en Powershell, je me suis débrouillé tant bien que mal et mon truc fonctionne plutôt pas mal. Pour réarchiver mes fichier, j’utilise une fonction toute trouvée sur divers sites :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function Add-Zip
{
    param([string]$zipfilename)

    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfilename)

    foreach($file in $input) {
            $extn = [IO.Path]::GetExtension($file)

            if ($extn -eq ".twb" -Or $extn -eq ".tde") {
                $zipPackage.CopyHere($file.FullName)
                Start-sleep -milliseconds 10000
            }
    }
}

La ligne en jaune est de moi. Et je n’en suis pas fier. J’ai beau ne pas être développeur de formation, je me rends bien compte que c’est moche. Si j’ai mis cette pause de 10 secondes dans mon script, c’est parce que les fichiers que je dois zipper sont parfois assez volumineux (environ 20 Mo), ce qui fait que mon script continue sa vie alors que les fichiers ne sont pas encore archivé. Forcément, ça plante. Tant qu’il n’y a que des petits fichiers, ça ne pose pas de problème.

Mais évidemment, attendre 10 secondes à chaque fichier à zipper, sachant que j’en ai un certain nombre et que seuls quelques uns sont volumineux, c’est nul. Au final mon script est beaucoup trop long.

Je me dis que le mieux serait de récupérer et tester un retour de mon $zipPackage.CopyHere($file.FullName), mais je n’y parviens pas. Et c’est du coup là que j’aurais besoin d’un œil avisé.

Toute autre idée pour optimiser le bousin et éviter ce sleep de 10 seconde m’irait aussi, bien sûr.

Pour finir, j’utilise la fonction Add-zip de cette manière :

1
2
$zip_dr = $CONFIG_PATH+'perf.zip'
dir $CONFIG_PATH'temp_'$DOCUMENT'\' -Recurse | Add-Zip $zip_dr

Merci pour votre aide !

+0 -0

J’ai regardé ta piste Anto mais j’ai fini par trouver une autre solution beaucoup plus efficace ! J’ai pu m’affranchir complètement de ma fonction foireuse avec ces quelques lignes :

1
2
3
4
Add-Type -assembly "system.io.compression.filesystem"
$source_zip = $CONFIG_PATH+'temp_'+$DOCUMENT
$destination_zip = $CONFIG_PATH+$reader.item("NOM_SORTIE_DOCUMENT")+'.zip'
[io.compression.zipfile]::CreateFromDirectory($source_zip, $destination_zip)

Merci beaucoup !

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte