Распакуйте файл с помощью Powershell в Server 2012 Core

15

Мне нужно распаковать файл с powershell. Типичный способ, которым я видел, как все это делают, - это автоматизировать оболочку с помощью скрипта.

$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
$destinationFolder = $shellApplication.NameSpace($destination)
$destinationFolder.CopyHere($zipPackage.Items())

Это не сработает для меня, так как в Server Core нет оболочки, поэтому не нужно ее автоматизировать. Это дает ошибку E_FAIL COM.

Похоже, что Powershell не в состоянии сделать это самостоятельно, и, если я пойду к третьей стороне, мне придется найти способ сценария, с помощью которого утилита будет доставлена ​​на сервер. 7-Zip был моим подходом, но, похоже, я не могу написать скрипт для его загрузки и установки. Sourceforge постоянно выкладывает мне обратно файлы HTML.

Как мне полностью выполнить сценарий распаковки zip-файла в Server 2012 Core?

vcsjones
источник
Что с требованием скачать 7zip с SF? Почему вы не можете установить / скопировать из внутреннего источника?
Longneck
@longneck PS-сценарий, который я создаю, будет разослан клиентам; поэтому сценарий должен быть полностью автономным. Я мог бы самостоятельно разместить утилиту zip, но это еще одна головная боль, которую я не хочу (legalese). Я просто надеялся, что есть простой командлет, который мог бы сделать это, который был представлен в 2012 году.
vcsjones
Если вы что-то раздаете клиентам, почему бы не создать самораспаковывающийся архив?
Зоредаче
@Zoredache Что ж, поначалу это казалось более трудоемким (наша система сборки уже создает ZIP), я надеялся, что это будет «очень быстро».
vcsjones

Ответы:

24

Server 2012 поставляется с Dot.NET 4.5, в которой есть System.IO.Compression.ZipFile, в котором есть метод ExtractToDirectory. Вы должны быть в состоянии использовать это из PowerShell.

Вот пример.

Для начала нужно загрузить сборку, в которой находится ZipFile:

[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null

Затем извлеките содержимое

[System.IO.Compression.ZipFile]::ExtractToDirectory($pathToZip, $targetDir)

Изменить: Если вы обновились до PowerShell 5 (Windows Management Framework 5.0), у вас наконец есть собственные командлеты:

Expand-Archive $pathToZip $targetDir
Питер Хандорф
источник
Я только что просмотрел System.IO.Compression, а ZipFile там нет. Есть обновление до 4.5, которое добавляет это?
Майк
Кажется, это было введено в 4.5, но не присутствует в 4.0. Если у вас есть 4.5, вы должны иметь его.
Питер Хандорф,
6
Давно пора, что для этого есть нативное решение.
MDMarra