Rozpakuj plik za pomocą Powershell w Server 2012 Core

15

Muszę rozpakować plik za pomocą programu PowerShell. Typowy sposób, w jaki widziałem, jak wszyscy to robią, to automatyzacja powłoki za pomocą skryptu.

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

Dla mnie to nie zadziała, ponieważ Server Core nie ma powłoki, więc nie można jej zautomatyzować. Daje to błąd COM E_FAIL.

Wydaje się, że Powershell nie jest w stanie zrobić tego samodzielnie, a jeśli pójdę na stronę trzecią, muszę najpierw znaleźć sposób na skryptowe przeniesienie narzędzia na serwer. 7-Zip było moim celem, ale nie wydaje mi się, żebym mógł napisać skrypt do pobrania i instalacji. Sourceforge wciąż wypluwa mi pliki HTML.

Jak mogę całkowicie skrypt rozpakować plik zip w Server 2012 Core?

vcsjones
źródło
Co jest wymagane w przypadku pobierania 7zip z SF? Wy nie możesz zainstalować / skopiować z wewnętrznego źródła?
longneck
@ Longneck Skrypt PS, który tworzę, zostanie przekazany klientom; więc skrypt musi być całkowicie samodzielny. I mógłby obsługiwać narzędzia zip siebie, ale jest to kolejny ból głowy nie chcę (UWAGI PRAWNE). Miałem tylko nadzieję, że istnieje prosty Cmdlet, który mógłby to zrobić, który został wprowadzony w 2012 roku.
vcsjones
Jeśli rozdajesz coś klientom, dlaczego nie zbudować samorozpakowującego się archiwum?
Zoredache,
@Zoredache Cóż, początkowo wydawało się, że to więcej pracy (nasz system kompilacji już buduje pliki ZIP), miałem nadzieję, że będzie to po prostu „bardzo szybkie”.
vcsjones,

Odpowiedzi:

24

Serwer 2012 jest dostarczany z Dot.NET 4.5, który ma System.IO.Compression.ZipFile, który ma metodę ExtractToDirectory. Powinieneś być w stanie korzystać z tego z PowerShell.

Oto przykład.

Najpierw musisz załadować zestaw, w którym znajduje się plik ZipFile:

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

Następnie wyodrębnij zawartość

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

Edycja: Jeśli zaktualizowano do programu PowerShell 5 (Windows Management Framework 5.0), w końcu masz natywne polecenia cmdlet:

Expand-Archive $pathToZip $targetDir
Peter Hahndorf
źródło
Właśnie przejrzałem System.IO.Compression i ZipFile nie ma. Czy istnieje aktualizacja 4.5, która ją dodaje?
Mike,
Wygląda na to, że wprowadzono to w 4.5, ale nie występuje w 4.0. Jeśli masz 4.5, powinieneś go mieć.
Peter Hahndorf
6
Cholerny czas, że istnieje natywne rozwiązanie tego problemu.
MDMarra