Compresser des fichiers dans le dossier de fichier zip en utilisant PS
J'ai les scripts suivants pour compresser un dossier (tous les fichiers dans le dossier) dans un fichier zip:
set-content $zipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
$ZipFile = (new-object -com shell.application).NameSpace($zipFileName)
Get-ChildItem $folder | foreach {$zipFile.CopyHere($_.fullname)}
où $dossier = "C:\Test" et $zipFileName = "C:\data\test.zip" à titre d'exemple
Il fonctionne très bien si "C:\Test" ne contient pas de vide sous-dossiers, et il semble fonctionne de manière récursive pour compresser tous les fichiers dans les sous-dossiers. J'aime vraiment simple ci-dessus de la ligne de script. Par exemple:
C:\Test
file1.dat
file2.dat
Test-Sub
File21.bat
....
Cependant, je suis d'erreur dans l'un des cas. Je trouver que si il ya une zone vide du dossier, telles que "C:\Test\EmptySub",
C:\Test
file1.dat
file2.dat
Test-Sub
File21.bat
....
EmptySub
AnotherSub
file31.sp1
...
le script va générer une erreur. J'ai essayé les scripts suivants:
Get-ChildItem $files -Recurse | foreach { if (!$_.PSIsContainer)
{$zipFile.CopyHere($_.fullname)}}
Cela ne fonctionne pas comme prévu. Il vient de saute de tous les sous-dossiers. Vous ne savez pas si il y a des filtre ou de la clause disponibles pour ignorer tous les vides, les sous-dossiers?
Mis à jour: sur la Base suggère, je lui ai donné un essai. Mon problème n'est pas résolu. Voici la mise à jour de ma question. Tout d'abord, j'ai mis à jour les scripts ci-dessus pour montrer comment $zipFile objet est créé. Deuxièmement, j'ai suggéré de codes:
Get-ChildItem $files | ? { -not ($_.PSIsContainer -eq $True -and
$_.GetFiles().Count -eq 0) } | % {$zipfile.CopyHere($_.fullname)}
J'ai essayé ci-dessus mises à jour sur mon windows xp, il fonctionne très bien avec vide sous-dossiers. Cependant, les mêmes codes ne pas workin dans Windows Server 2003. Voici le message d'erreur:
[Titre De La Fenêtre]
Dossiers compressés (zippés) Erreur
[Contenu]
Fichier non trouvé ou pas l'autorisation de lecture.
[OK]
Ne sais pas si ce type PK objet fonctionne sous Windows 2003 server, ou si il y a d'autres paramètres de l'objet.
OriginalL'auteur David.Chu.ca | 2011-04-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez détecter les répertoires vides par des tests contre un retour à vide à partir de get-childitem. Par exemple, ce sera le retour de la liste des répertoires vides
Bien que dans votre cas, vous souhaitez, à l'inverse:
OriginalL'auteur zdan
Votre code fonctionne de manière récursive dans le sens que vous obtenez toute sorte d'enfant (les dossiers inclus). Si votre intention est d'exclure des dossiers vides que vous devriez filtrer:
Essayez celui-doublure:
OriginalL'auteur Emiliano Poggi
Voici la fonction que j'ai créé pour les fichiers zip. La raison pourquoi vous obtenez l'erreur de lecture est parce que .CopyHere est asynchrone processus de copie, donc mon script vérifie que le fichier existe dans le fichier zip avant de continuer vers le prochain fichier zip:
OriginalL'auteur Eric Buschman