Как распаковать файл в Powershell?
У меня есть .zip
файл и нужно распаковать весь его контент с помощью Powershell. Я делаю это, но это не похоже на работу:
$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)
}
В чем дело? Каталог C:\a
все еще пусто
10 ответов
Вот простой способ использования ExtractToDirectory из 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"
Обратите внимание, что если целевая папка не существует, ExtractToDirectory создаст ее.
В PowerShell v5+ есть команда Expand-Archive (а также Compress-Archive), встроенная в:
Expand-Archive c:\a.zip -DestinationPath c:\a
PowerShell v5.1, похоже, немного отличается от v5. Согласно документу MS он должен иметь параметр -Path для указания пути к архивному файлу.
Expand-Archive -Path Draft.Zip -DestinationPath C:\Reference
Или это может быть фактический путь, как показано ниже,
Expand-Archive -Path c:\Download\Draft.Zip -DestinationPath C:\Reference
Использование Expand-Archive
Командлет с одним из набора параметров:
Expand-Archive -LiteralPath C:\source\file.Zip -DestinationPath C:\destination
Expand-Archive -Path file.Zip -DestinationPath C:\destination
Эй, это работает для меня..
$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)
}
Используйте встроенный метод PowerShell
Expand-Archive
Пример
Expand-Archive -LiteralPath C:\archive.zip -DestinationPath C:\
С помощью expand-archive
но автоматически создаваемые каталоги названы в честь архива:
function unzip ($file) {
$dirname = (Get-Item $file).Basename
New-Item -Force -ItemType directory -Path $dirname
expand-archive $file -OutputPath $dirname -ShowProgress
}
Для тех, кто хочет использовать Shell.Application.Namespace.Folder.CopyHere() и хочет скрыть индикаторы выполнения при копировании или использовать дополнительные параметры, документация здесь:
https://docs.microsoft.com/en-us/windows/desktop/shell/folder-copyhere
Чтобы использовать powershell и скрывать индикаторы выполнения и отключать подтверждения, вы можете использовать код, подобный следующему:
# 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)
Ограничения использования Shell.Application на версиях ядра Windows:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
В основных версиях Windows по умолчанию Microsoft-Windows-Server-Shell-Package не установлен, поэтому shell.applicaton не будет работать.
примечание: извлечение архивов таким способом займет много времени и может замедлить работу графического интерфейса Windows.
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)
}
}
С помощью:
unzip 'Applications\Site.zip' 'C:\inetpub\wwwroot\Site'
ForEach
Loop обрабатывает каждый ZIP-файл, расположенный в $filepath
переменная
foreach($file in $filepath)
{
$zip = $shell.NameSpace($file.FullName)
foreach($item in $zip.items())
{
$shell.Namespace($file.DirectoryName).copyhere($item)
}
Remove-Item $file.FullName
}