Как заархивировать / разархивировать файлы в Powershell?

Ответы:

21

DotNetZip позволит вам сделать это из PowerShell. Это не однострочник, но библиотека позволит вам написать сценарий PowerShell, который вам нужен.

Вы также можете использовать интерфейс COM, см. « Сжатие файлов с помощью Windows PowerShell», а затем пакетирование гаджета боковой панели Windows Vista .

Поиск "zip powershell" или "unzip powershell" также может принести полезные результаты.

Кевин Куфал
источник
+1 Связанная статья имеет полезные задачи, в отличие от самого популярного ответа
Рубен Бартелинк
5
-1 за предложение поиска в Google. Это лучший результат StackExchange в поиске Google для "unzip powershell"
машина жаждет
154

Вот как вы можете сделать это чисто из Powershell без каких-либо внешних инструментов. Это распаковывает файл с именем test.zip в текущий рабочий каталог:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())
Амир Дин
источник
26
используйте $ destination.Copyhere ($ zip_file.items (), 0x10) для перезаписи существующих файлов. 0x4 скрывает диалоговое окно, а 0x14 объединяет их, перезаписывает и скрывает диалоговое окно.
Питер
3
Линия $destination.Copyhere($zip_file.items())выполняет распаковку.
Джонатан Аллен
2
Вы можете разделить вышеперечисленное в функцию, если хотите: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
Джеймс Холвелл
6
Это должен быть принятый ответ.
tugberk
2
Это терпит неудачу для меня, когда почтовый файл содержит только папку (элементы пустые)
Джеймс Вулфенден
56

Теперь в .NET Framework 4.5 есть класс ZipFile, который вы можете использовать следующим образом:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
mousio
источник
1
Это было бы здорово, если бы существовал простой метод для ExtractToDirectory и возможность перезаписать все существующие файлы.
Джеймс Данн
1
Это работает с .NET 4.5. Однако вам также нужен Powershell V3.
DalSoft
3
Загрузите сборку с помощью Add-Type, например: Add-Type -AssemblyName System.IO.Compression.FileSystem
Майк
2
@JamesDunne - если у вас нет других файлов, которые нужно сохранить, можно использовать «Remove-Item -Recurse $ TargetFolder». В противном случае то, что вы хотите, может быть сделано, но это было бы нетривиально. Вам нужно будет открыть почтовый индекс для чтения, а затем пройтись по нему, удалив любой предыдущий целевой объект и распаковав новый. К счастью для меня, простое решение работает. ;)
Майк
3
Имейте в виду, что для относительного расположения файлов будет использоваться текущий каталог .NET , а не PowerShell. Смотрите здесь . Наверное, лучше просто (Resolve-Path $someDir).Pathрассуждать.
jpmc26
18

Возможно, вы захотите проверить расширения сообщества PowerShell (PSCX), в которых есть специально предназначенные для этого командлеты.

Кевин Колби
источник
1
+1 PSCX - отличный набор дополнительных командлетов - я просто хотел бы выбрать больше, какие я хочу, а какие нет. Кажется, что в моем экземпляре Powershell многое изменилось ...
marc_s
Я сталкивался с этим, потому что я действительно хочу автоматизировать установку PSCX, если я могу для некоторых коллег. Попытка сделать это сейчас, чтобы увидеть, с какими проблемами я сталкиваюсь
jcolebrand
16

Я знаю, что это очень старый вопрос, но я только что увидел его в Твиттере и решил опубликовать текущий ответ.

PowerShell 5, доступный в настоящее время в Windows 10 или в Windows Management Framework 5 Production Preview , поставляется с двумя встроенными командлетами для «архивирования» и «разархивирования»:

Windos
источник
3
Это хорошая вещь , чтобы представить новую информацию на старые вопросы. ;) +1
jpmc26
5

Я нахожу самое простое решение - использовать двоичные файлы infozip, которые я использовал годами, и использовать их в среде UNIX.

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

Было бы просто поместить оболочку powershell вокруг вывода текста, но на практике мне это никогда не нужно, поэтому я не стал беспокоиться.

http://www.info-zip.org/

Брайан Райтер
источник
5

Мне также нравится Info-ZIP (механизм Zip, встречающийся в большинстве других утилит Zip) и 7-Zip , еще один фаворит, в котором есть утилита Zip с графическим интерфейсом и командной строкой. Дело в том, что есть несколько хороших утилит командной строки, которые будут работать для большинства задач PowerShell.

Есть несколько хитростей для запуска утилит командной строки, которые не были созданы с учетом PowerShell:

  • Запустив исполняемый файл, который начинается с числа в имени, предварите его амперсандом (&).

    & 7zip.exe

  • Оберните каждый токен, который утилита ожидает увидеть из командной строки в кавычках.

    & "c: \ path with space \ SomeCommand.exe" "/ parameter2" "/ parameter2" "Значение параметра2" "Значение2` "с кавычкой"

Попробуй это:

zip filename.zip (Get-ChildItem somepath\*)

Или даже:

zip filename.zip (Get-Content ListOfFiles.txt)
Натан Хартли
источник
2

Джеймс Холвелл Мне нравится твой ответ, но я немного его расширил

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}
Нико
источник
0

WinRAR может работать в режиме CMD, принимая аргументы

adopilot
источник
0

Я создал PowerShell 2.0-совместимый модуль, который использует собственные команды ОС Windows для синхронного сжатия и распаковки файлов. Это работает на старых ОС, таких как Windows XP, и не требует .Net 4.5 или каких-либо других внешних инструментов. Функции также будут блокировать выполнение скрипта, пока все файлы не будут заархивированы / разархивированы. Вы можете найти больше информации и модуля в моем блоге здесь .

deadlydog
источник