Як зберігати / розпаковувати файли в Powershell?


Відповіді:


21

DotNetZip дозволить зробити це від PowerShell. Це не однолінійний, але бібліотека дозволить вам написати потрібний сценарій PowerShell.

Ви також можете використовувати інтерфейс COM, див. Стиснення файлів за допомогою Windows PowerShell, а потім упакуйте гаджет бічної панелі Windows Vista .

Гуглінг "zip powershell" або "unzip powershell" також може виявити корисні результати.


+1 Пов’язана стаття має корисні завдання на відміну від найбільш схваленої відповіді
Рубен Бартелінк

5
-1 за пропозицію пошуку в Google. Це найкращий результат StackExchange в пошуку в Google за "розпакувати повноваження"
машина, яка прагне

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
використовуйте $ target.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
Це має бути прийнятою відповіддю.
тугберк

2
Для мене це не вдається, коли поштовий файл містить лише папку (елементи порожні)
James Woolfenden

56

Тепер у .NET Framework 4.5 є клас ZipFile, який ви можете використовувати так:

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

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, якщо зможу для колег. Спробую зараз побачити, з якими проблемами я
стикаюся

16

Я знаю, що це дуже давнє запитання, але я щойно бачив, як це пов’язано у Twitter, подумав, що опублікую поточну відповідь.

PowerShell 5, який зараз доступний у Windows 10 або за допомогою Windows Management Framework 5 Preview Preview , поставляється з двома вбудованими командлетами для "блискавки" та "розпакування":


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.

Було б одразу ж поставити обгортку з силою оболонки навколо виводу тексту, але на практиці мені це ніколи не потрібно, тому я не переймався.

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


5

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

Існує кілька хитрощів із запуском утиліт командного рядка, які не були побудовані з урахуванням PowerShell:

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

    & 7zip.exe

  • Оберніть кожен маркер, утиліта очікує побачити з командного рядка в лапки.

    & "c: \ шлях з пробілом \ SomeCommand.exe" "/ parameter2" "/ parameter2" "value2" value "" Value2 `" з цитатою "

Спробуйте це:

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

Або навіть:

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

2

James Holwell Мені подобається ваша відповідь, але я її трохи розширив

# 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.