Вопрос: Как распаковать / распаковать файлы в Powershell?


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


103
2018-06-03 15:57


Источник


Связанный: Распаковать с помощью PS в Server Core - Ruben Bartelink


Ответы:


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

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

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


21
2018-06-03 16:02



+1 Связанная статья имеет полезные задачи, в отличие от наиболее употребительного ответа - Ruben Bartelink
-1 для запроса поиска Google. Это результат вершины StackExchange в поиске Google для «unzip powershell», - machine yearning


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

153
2017-11-14 01:36



используйте $ destination.Copyhere ($ zip_file.items (), 0x10) для перезаписывания существующих файлов. 0x4 скрывает диалоговое окно, а 0x14 объединяет их и перезаписывает и скрывает диалог. - Peter
Линия $destination.Copyhere($zip_file.items()) делает фактический unziping. - Jonathan Allen
Вы можете поместить вышеуказанное в функцию, если хотите: 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()) } - James Holwell
Это должен быть принятый ответ. - tugberk
Это не подходит для меня, когда zip-файл содержит только папку (элементы пустые) - James Woolfenden


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

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

54
2017-12-30 17:46



Это определенно работал - я использовал его для извлечения более 400 ZIP-файлов. Я проверю, чтобы убедиться, что у меня нет версии 4.5, но она не отображается в Microsoft.NET. - GalacticCowboy
Эта бы если бы был простой метод ExtractToDirectory и возможность перезаписывать все существующие файлы. - James Dunne
Загрузите сборку с помощью Add-Type, например: Add-Type -AssemblyName System.IO.Compression.FileSystem - Mike
@JamesDunne - Если у вас нет других файлов, которые нужно сохранить, можно использовать «Удалить-Item -Recurse $ TargetFolder». В противном случае вы можете сделать то, что вы хотите, но это было бы нетривиально. Вам нужно будет открыть zip для чтения, а затем пройти zip, удалив любой предыдущий целевой объект и распакуя новый. К счастью для меня, простое решение работает. ;) - Mike
Следует предупредить, что относительные местоположения файлов будут использовать .СЕТЬ Текущий каталог, не PowerShell. Видеть Вот, Вероятно, лучше всего просто (Resolve-Path $someDir).Path аргументы. - jpmc26


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


18
2018-06-03 15:59



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


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

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


13
2017-10-17 20:59



Это хорошо чтобы предоставить новую информацию старым вопросам. ;) +1 - jpmc26


Я нахожу самое простое решение для использования двоичных файлов 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.

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

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


5
2017-08-03 19:40





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

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

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

    & 7zip.exe

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

    & "c: \ path with space \ SomeCommand.exe" "/ parameter2" "/ parameter2" "значение параметра2" Value2 `" с цитатой "

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

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

Или даже:

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

5
2017-08-11 15:07





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

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

2
2017-10-11 17:56





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


0
2017-08-03 19:49