J'ai un fichier .Zip
et j'ai besoin de décompresser tout son contenu avec Powershell. Je fais ça mais ça ne semble pas marcher:
$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.
Voici un moyen simple d'utiliser ExtractToDirectory à partir de System.IO.Compression.ZipFile:
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
param([string]$zipfile, [string]$outpath)
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}
Unzip "C:\a.Zip" "C:\a"
Notez que si le dossier cible n'existe pas, ExtractToDirectory le créera.
Dans PowerShell v5 +, il existe un commande Expand-Archive (ainsi que Compress-Archive):
Expand-Archive c:\a.Zip -DestinationPath c:\a
Dans PowerShell v5.1, cela est légèrement différent de celui de v5. Selon la documentation MS, il doit comporter un paramètre -Path
pour spécifier le chemin du fichier d’archive.
Expand-Archive -Path Draft.Zip -DestinationPath C:\Reference
Ou alors, cela peut être un chemin réel:
Expand-Archive -Path c:\Download\Draft.Zip -DestinationPath C:\Reference
Hé ça marche pour moi ..
$Shell = New-Object -ComObject Shell.application
$Zip = $Shell.NameSpace("put ur Zip file path here")
foreach ($item in $Zip.items()) {
$Shell.Namespace("destination where files need to unzip").CopyHere($item)
}
Utilisez la cmdlet Expand-Archive
avec l'un des paramètres définis:
Expand-Archive -LiteralPath C:\source\file.Zip -DestinationPath C:\destination
Expand-Archive -Path file.Zip -DestinationPath C:\destination
Utiliser expand-archive
mais créer automatiquement des répertoires nommés d'après l'archive:
function unzip ($file) {
$dirname = (Get-Item $file).Basename
New-Item -Force -ItemType directory -Path $dirname
expand-archive $file -OutputPath $dirname -ShowProgress
}
function unzip {
param (
[string]$archiveFilePath,
[string]$destinationPath
)
if ($archiveFilePath -notlike '?:\*') {
$archiveFilePath = [System.IO.Path]::Combine($PWD, $archiveFilePath)
}
if ($destinationPath -notlike '?:\*') {
$destinationPath = [System.IO.Path]::Combine($PWD, $destinationPath)
}
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
$archiveFile = [System.IO.File]::Open($archiveFilePath, [System.IO.FileMode]::Open)
$archive = [System.IO.Compression.ZipArchive]::new($archiveFile)
if (Test-Path $destinationPath) {
foreach ($item in $archive.Entries) {
$destinationItemPath = [System.IO.Path]::Combine($destinationPath, $item.FullName)
if ($destinationItemPath -like '*/') {
New-Item $destinationItemPath -Force -ItemType Directory > $null
} else {
New-Item $destinationItemPath -Force -ItemType File > $null
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($item, $destinationItemPath, $true)
}
}
} else {
[System.IO.Compression.ZipFileExtensions]::ExtractToDirectory($archive, $destinationPath)
}
}
En utilisant:
unzip 'Applications\Site.Zip' 'C:\inetpub\wwwroot\Site'
Pour ceux qui veulent utiliser Shell.Application.Namespace.Folder.CopyHere () et veulent masquer les barres de progression lors de la copie, ou utiliser davantage d'options, la documentation est la suivante:
https://docs.Microsoft.com/en-us/windows/desktop/Shell/folder-copyhere
Pour utiliser powershell, masquer les barres de progression et désactiver les confirmations, utilisez le code suivant:
# We should create folder before using it for Shell operations as it is required
New-Item -ItemType directory -Path "C:\destinationDir" -Force
$Shell = New-Object -ComObject Shell.Application
$Zip = $Shell.Namespace("C:\archive.Zip")
$items = $Zip.items()
$Shell.Namespace("C:\destinationDir").CopyHere($items, 1556)
Limitations d'utilisation de Shell.Application sur les versions principales de Windows:
https://docs.Microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
Sur les versions de Windows core, par défaut, Microsoft-Windows-Server-Shell-Package n'est pas installé. Par conséquent, Shell.applicaton ne fonctionnera pas.
note : L'extraction d'archives de cette manière prendra beaucoup de temps et peut ralentir le fonctionnement de Windows gui .