J'ai un .zip
fichier et j'ai besoin de décompresser tout son contenu à l'aide de Powershell. Je fais ça mais ça ne semble pas fonctionner:
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\a.zip")
MkDir("C:\a")
foreach ($item in $zip.items()) {
$shell.Namespace("C:\a").CopyHere($item)
}
Qu'est-ce qui ne va pas? Le répertoire C:\a
est toujours vide.
powershell
Uli Kunkel
la source
la source
Réponses:
Voici un moyen simple d'utiliser ExtractToDirectory de System.IO.Compression.ZipFile :
Notez que si le dossier cible n'existe pas, ExtractToDirectory le créera. Autres mises en garde:
Voir également:
la source
Exception calling "ExtractToDirectory" with "2" argument(s): "End of Central Directory record could not be found." At line:5 char:5 + [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $ou ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : InvalidDataException
Add-Type : Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found.
. J'ai .NET 4.6.2 installé et j'ai vérifié que l'assembly est dans le GAC, mais je n'ai pas compris pourquoi j'obtiens cette erreur.Dans PowerShell v5 +, il existe une commande Expand-Archive (ainsi que Compress-Archive) intégrée dans:
la source
$PSVersionTable.PSVersion
pour déterminer la version de PowerShell que vous exécutez.OutputPath
a été changé enDestinationPath
(référence msdn.microsoft.com/powershell/reference/5.1/… )Expand-Archive -Path .\a.zip -DestinationPath .
Dans PowerShell v5.1, cela est légèrement différent de v5. Selon la documentation MS, il doit avoir un
-Path
paramètre pour spécifier le chemin du fichier d'archive.Ou bien, cela peut être un chemin réel:
Expand-Archive Doc
la source
Expand-Archive Draft.Zip -DestinationPath C:\Reference
fonctionne sans problème. De plus, ce n'est pas un chemin réel , mais un chemin absolu .Utilisez l'
Expand-Archive
applet de commande avec l'un des jeux de paramètres:la source
Hey ça marche pour moi ..
la source
CopyHere
méthode. Je suppose que @OlegKazakov a déjà résolu son problème. Néanmoins, je mets ce lien ici pour les autres surfeurs qui peuvent trouver ce sujet: docs.microsoft.com/en-us/previous-versions/windows/desktop/…Pour ceux qui souhaitent utiliser Shell.Application.Namespace.Folder.CopyHere () et veulent masquer les barres de progression lors de la copie, ou utiliser plus d'options, la documentation est ici:
https://docs.microsoft.com/en-us / windows / desktop / shell / folder-copyhere
Pour utiliser PowerShell et masquer les barres de progression et désactiver les confirmations, vous pouvez utiliser un code comme celui-ci:
Limitations d'utilisation de Shell.Application sur les versions de base de Windows:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
Sur les versions de base de Windows , par défaut, Microsoft-Windows-Server-Shell-Package n'est pas installé, donc shell.applicaton ne fonctionnera pas.
Remarque : l'extraction des archives de cette manière prendra beaucoup de temps et peut ralentir l'interface graphique de Windows.
la source
Utilisation
expand-archive
mais création automatique de répertoires nommés d'après l'archive:la source
outputPath
comme dans la réponse acceptée. Dans cette solution (comme l'a dit jpmc26), vous créerez toujours un nouveau répertoire dans le répertoire actuel, il est donc possible que vous deviez définir le répertoire actuel avant d'appelerunzip
En utilisant:
la source
$archive
et$archiveFile
à la finForEach
La boucle traite chaque fichier ZIP situé dans la$filepath
variablela source