Назад | Перейти на главную страницу

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

Есть ли однострочный файл, который будет архивировать / распаковывать файлы (* .zip) в PowerShell?

Вот как вы можете сделать это исключительно из 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())

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

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

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

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

Поиск в Google «zip powershell» или «unzip powershell» также может дать полезные результаты.

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

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

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

Я считаю, что самое простое решение - просто использовать двоичные файлы 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/

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

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

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

    & 7zip.exe

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

    & "c: \ путь с пробелом \ SomeCommand.exe" "/ параметр2" "/ параметр2" "Значение параметра2" "Значение2` "с кавычкой"

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

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

Или даже:

zip filename.zip (Get-Content ListOfFiles.txt)

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

# 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()) 
}

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

Ионный подход порождает:

https://dotnetzip.codeplex.com/wikipage?title=PS-Examples

поддерживает пароли, другие методы шифрования и т. д.

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