Как вы можете сжать или разархивировать сценарий, используя встроенные возможности ТОЛЬКО в Windows?

294

В Windows вы можете архивировать некоторые файлы

щелкните правой кнопкой мыши → Отправить вСжатую (заархивированную) папку

И распакуйте, дважды щелкнув .zipфайл и извлеките файлы.

Есть ли способ применить эти возможности из сценария (файл .bat) без необходимости установки какого-либо стороннего программного обеспечения ?

Роуи Гавирель
источник
16
Ну, это, вероятно, для того, чтобы вызвать его из командного файла или программы. (Вот почему я здесь - пытаюсь создать быстрый файл .BAT, чтобы «собрать» небольшой продукт для веб-сайта, для которого требуется, чтобы он был в виде zip-файла.)
Джон Кумбс
46
Безумно, что этот вопрос был закрыт.
Сэм Голдберг,
1
Можно ли перенести этот вопрос в Super User?
Hanxue
21
Все еще очень полезно и актуально в 2018 году.: P
Michael Fever

Ответы:

82

Еще в 2013 году это было невозможно. Microsoft не предоставила никакого исполняемого файла для этого.

Смотрите эту ссылку для некоторых VBS способ сделать это. /superuser/201371/create-zip-folder-from-the-command-line-windows

Начиная с Windows 8, .NET Framework 4.5 устанавливается по умолчанию, с доступными System.IO.Compression.ZipArchive и PowerShell, для этого можно написать сценарии, см. Https://stackoverflow.com/a/26843122/71312.

Diryboy
источник
1
Это неверно, учитывая, что PS разрешает это и предварительно установлено в Windows и доступно через командную строку.
Дэн Аткинсон
4
@DanAtkinson Обновлено. Ответ был дан еще в 2013 году, ссылка предоставила какой-то VBS способ. Путь PS требует .Net 4.5, который требует Windows 8 или выше.
Diryboy
Спасибо за обновление! Изменили мой голос соответственно. :)
Дэн Аткинсон
6
@MichaelMrozek Ну, «командная строка» в общем относится к любой командной строке, а не конкретно к CMD / COMMAND, и PS определенно является командной строкой, как bash, sh, rsh для * nix. Но просто для продолжения, так как вы можете запустить powershell из командной строки, он отвечает на вопрос, даже если вы хотите верить, что cmd / command - это единственная командная строка.
Роберт Макки
1
Это было возможно еще в 2013 году (без установки дополнительного программного обеспечения). Смотрите вопрос о Супер Пользователе . Это стало возможным с момента выхода Windows XP в 2001 году. Встроенную функциональность ZIP в Windows XP можно использовать, поскольку она предоставляется через интерфейс COM .
Питер Мортенсен
180

Чтобы расширить решение PowerShell Стивена Пенни, вы можете включить его в пакетный файл, вызвав powershell.exe следующим образом:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Как сказал Иван Шило, это не будет работать с PowerShell 2, для этого требуется PowerShell 3 или выше и .NET Framework 4.

Джейсон Даффетт
источник
1
На самом деле, это было доступно в .NET 4.5.
qJake
10
Для тех (как я), которые задаются вопросом, как извлечь в настоящий каталог (вместо создания нового каталога) просто установите целевой параметр '.', например:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin
Можем ли мы использовать эти команды для увеличения сжатия? Как сделать это Ultra сжатие, чтобы уменьшить размер файла?
Найджел Фдс
1
Какова цель & {}? С PS5 это тоже работает:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Рой Дантон
@RoiDanton Как использовать stringformatter для определения src.zip и dest.zip?
PySaad
161

Начиная с .NET 4.5 PowerShell может делать это:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Для последних двух строк, barи fooможет быть заменено на имя, которое вы хотели бы иметь в папке, или любое другое имя существующей папки. foo.zipв обоих случаях действует как zip-файл либо для сохранения, либо для распаковки.

Стивен Пенни
источник
17
Это как в .NET 4.5.
qJake
Можем ли мы использовать эти команды для увеличения сжатия? Как сделать это Ultra сжатие, чтобы уменьшить размер файла?
Найджел Фдс
У меня .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705, установленный на виртуальной машине, установленной отсюда: developer.microsoft.com/en-us/microsoft-edge/tools/vms , и это работает. так что я предполагаю, что вам не нужен .NET 4.5
alpha_989
Это наиболее практичное решение для современных систем, при этом размер zip превышает 2 ГБ, тогда как стандартный Powershell «Compress-Archive» не удастся.
Шукри Адамс
135

Если у вас установлена ​​Java, вы можете сжать ее в ZIP-архив с помощью jarкоманды:

jar -cMf targetArchive.zip sourceDirectory

c = Создает новый файл архива.

M = Указывает, что файл манифеста не должен быть добавлен в архив.

f = Указывает имя целевого файла.

Ноам Манос
источник
3
офигенно, спасибо, именно то, что я искал ... К вашему сведению - мне пришлось удалить символ минус в DOS ... например, jar cMf target.zip sourceDir
mlo55
3
Неплохо, но вам нужен JDK, а не JRE.
августа
2
Хорошее, вероятно, самое платформо-независимое решение для этого;)
Адриан
YMMD. классная идея сэкономил мне много времени.
Gorefest
3
Покрывается ли это «... использованием только встроенных возможностей Windows ?» (мой акцент)
Питер Мортенсен
84

PowerShell 5.0

Из Microsoft.PowerShell.Archiveвы можете использовать:

Например:

  • Создать result.zipиз всей Testпапки:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Распакуйте содержимое result.zipв указанную Testпапку:

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
ROMANIA_engineer
источник
13
Это прекрасно работает, спасибо. Для любого, кто оказался здесь, вы можете использовать powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipпрямо из командной строки без необходимости создавать сценарий (при условии, что у вас установлен Powershell v5, что вы можете сделать, по крайней мере, возвращаясь к Windows 7).
Beems
Отлично работает, добавьте опцию -Force, если вы планируете перезапустить его
Робин Салих
1
@Beems, спасибо! Но я думаю, что ты с ума сошел путь / пункт назначения наоборот?
Yiping
Это работает, но архив сжимается иначе, чем то, что происходит, если вы используете проводник Windows «Отправлено -> сжатая (заархивированная) папка». Версия powershell больше, и некоторые программы не могут извлечь
Эрик Лабашоски,
Compress-Archive имеет максимальный лимит файла 2 ГБ на входной файл
Сергей Родионов
37

Это не совсем ZIP, но единственный способ сжать файл с помощью инструментов Windows:

makecab <source> <dest>.cab

Чтобы распаковать:

expand <source>.cab <dest>

Расширенный пример (с ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Более подробная информация: MakeCab , расширение , MakeCAB расширенного использования

Федерико Сантаморена
источник
34

Используя 7-Zip:

Zip : у вас есть папка foo, и вы хотите сжать ееmyzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

Разархивировать : вы хотите разархивировать его ( myzip.zip) в текущий каталог ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
Monir
источник
31
Пожалуйста, обратите внимание на вопрос:without the need to install any 3rd party
Роу Гавирель
16
@RoeeGavirel 7zip должна быть одной из первых вещей, которую вы устанавливаете при любой установке Windows: P
developerbmw
3
@developerbmw - А. Почему это? Б. Я работаю с ~ 100 машинами, на которых нет 7zip. Чтобы установить это, мне нужно было бы установить DevOps на все эти машины и на все новые машины, которые будут добавлены в кластеры. Я бы предпочел этого избежать.
Роуи Гавирель
1
@Roland: не могли бы вы быть пространным; где это идет не так? Это поможет всем.
Монир
1
@Roland: только что проверил, синтаксис работает хорошо. Возможно, вы пытаетесь с папкой "foo", которой нет на вашей машине. Просто угадай, хотя.
Монир
9

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

Я обнаружил, что программа compact.exe сжимает файлы, но не для создания сильно сжатого файла (или набора файлов). Это похоже на параметр, который вы получаете, щелкнув правой кнопкой мыши по букве диска или раздела в Windows. Вы можете выполнить очистку (удалить временные файлы и т. Д.), А также сжать файлы. Сжатые файлы по-прежнему доступны, но просто сжимаются, чтобы освободить место на диске, на котором мало места.

Я также нашел compress.exe, который у меня случился на моем компьютере. Это не изначально на большинстве машин Windows и является частью набора ресурсов 2003 года. Он создает сжатый файл, но на самом деле он больше похож на файлы с установочного диска Windows (подчеркивание является последним символом расширения или имени файла). И команда extract.exe извлекает эти файлы.

Тем не менее, мантра заключается в том, что если это можно сделать естественным образом с помощью графического интерфейса, то, скорее всего, есть способ сделать это с помощью пакета, .vbs или другого типа сценария в командной строке. Поскольку в Windows была опция «отправить» для создания zip-файла, я знал, что должен быть способ сделать это через командную строку, и я нашел несколько вариантов.

Вот отличная ссылка, которая показывает, как заархивировать файл с помощью собственных команд Windows.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

Я протестировал его с каталогом, содержащим несколько вложенных файлов и папок, и он работал отлично. Просто следуйте формату командной строки.

Есть также способ разархивировать файлы через командную строку, которую я также нашел. Один из способов - просто открыть окно обозревателя, в котором показано содержимое сжатого файла. Некоторые из них также используют Java, который не обязательно является родным для окон, но настолько распространен, что кажется почти так.

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Как распаковать файл с помощью командной строки?

LostUser
источник
Нет, ответ DiryBoy не точен
Питер Мортенсен
8

Вы можете использовать скрипт VBScript, завернутый в BAT-файл. Этот код работает на относительном PATH.

Там нет необходимости каких-либо сторонних инструментов или зависимостей. Просто установите SOURCEDIRи OUTPUTZIP.

Имя файла: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty ZIP file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Пример использования

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

В качестве альтернативы, вы можете параметризовать этот файл, заменив строку CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%на CScript _zipup.vbs %1 %2, и в этом случае его можно еще проще вызвать простым вызовом CALL ZipUp C:\Source\Dir C:\Archive.zip.

PodTech.io
источник
Строка, которая создает исходный zip-файл, должна быть экранирована, иначе она не попадет в скрипт.
Кубок
Да, это путь (как в вопросе суперпользователя ).
Питер Мортенсен
Я добавил правильно экранированную версию в качестве ответа.
fsteff
5

У меня проблема со всеми этими решениями.

Они не совсем одинаковые, и все они создают файлы, которые имеют небольшую разницу в размере по сравнению с файлами RMB --> send to --> compressed (zipped) folderиз одной и той же исходной папки. Самое близкое различие в размере, которое у меня было, - разница в 300 КБ (скрипт> руководство), сделанная с:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(Обратите внимание на -CompressionLevel . Существует три возможных значения : Fastest, NoCompression & Optimal, (по умолчанию: Optimal))

Я хотел создать файл .bat, который должен автоматически сжимать папку плагина WordPress, над которой я работаю, в архив .zip, чтобы я мог загрузить его на сайт WordPress и протестировать плагин.

Но по какой-то причине он не работает ни с одним из этих автоматических сжатий, но он работает с ручным сжатием RMB, что я считаю действительно странным.

И сгенерированные скриптом .zip-файлы фактически разбивают плагины WordPress до такой степени, что их невозможно активировать, а также их нельзя удалить изнутри WordPress. Я должен SSH в «обратную сторону» сервера и вручную удалить загруженные файлы плагинов. Хотя вручную сгенерированные файлы RMB работают нормально.

Себастьян Норр
источник
Что такое "WBR" и "RMB" ?
Питер Мортенсен
ПКМ = правая кнопка мыши. <wbr> = HTML-тег, который обозначает «возможность Word BReak» для браузера (удален, потому что он не работал).
Себастьян Норр,
4

Если вам нужно сделать это как часть скрипта, тогда лучше всего использовать Java. Предполагая, что каталог bin находится в вашем пути (в большинстве случаев), вы можете использовать командную строку:

jar xf test.zip

Если Java не на вашем пути, обратитесь к нему напрямую:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
eddyoc
источник
3

С открытым исходным кодом ваш друг :-)

Вот распаковка : http://gnuwin32.sourceforge.net/packages/unzip.htm

Также есть команда ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

Двоичные файлы загрузки достаточно.

JanBorup
источник
В Windows 8 выдает ошибку: отсутствует bzip2.dll.
Дуг
1
@ Дуг говорит, что bzip2 является требованием на странице и имеет ссылку для загрузки
Сэм
11
Первоначальный вопрос заключался в том, как использовать стандартные встроенные команды Windows. Кроме того, требовать от пользователей установки различных сторонних решений нежелательно, поскольку ваш собственный инструмент или решение теперь ограничено пользователями, которые имеют права администратора на своем компьютере или которые не заботятся о растущем наборе небольших зависимостей в их системе. , С открытым исходным кодом может быть вашим другом, но пакеты с открытым исходным кодом, требующие установки других пакетов с открытым исходным кодом, требующие установки других пакетов с открытым исходным кодом и т. Д., Безусловно, не являются вашими друзьями.
Стив Холлаш
SourceForge заблокирован политикой брандмауэра моей работы :-(
SnookerC
1
Это все еще использует стороннее программное обеспечение
Деян Добромиров
3

Это обновленная версия для ответа, предоставленного @ PodTech.io

В этой версии все коды VBS правильно экранированы в командном файле. Он также создан в подпрограмму, которая может быть вызвана одной строкой из любого места в вашем пакетном скрипте:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof
fsteff
источник
2

Вы говорите, что пытаетесь сделать это без стороннего программного обеспечения. Я не уверен, что вы считаете .NET "сторонним" программным обеспечением.

Но вы можете создать свою собственную утилиту командной строки в .NET. Это не должно требовать больше, чем несколько строк кода.

Класс ZipFile

NL3294
источник
0

Добавление на @Jason Duffett в ответ и его комментарии, вот скрипт , который получает входной и выходной (имя файла и имя каталога, соответственно) от пользователя:

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

Использование:

unzip.bat path\to\file.zip path\to\output\directory
HeyJude
источник
-4

Чтобы заархивировать файл:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 максимальное сжатие
  • -m удалить исходный файл после успешного сжатия
  • -о установить дату изменения zip-файла так же, как исходный файл
  • Жаль, что нужно дать ему имя нужного zip-файла вместо того, чтобы просто добавить расширение .zip к имени файла для сжатия.
Тулаинс Кордова
источник
4
две вещи: (1) «zip» не предоставляется с окнами, так что, вероятно, у вас есть сторонняя организация. и как уже упоминался мой вопрос, я не могу установить третьи стороны. (2) Причина, по которой вам нужно указать желаемое имя, заключается в том, что при создании архива и архивации файлов (например, в папке в сеансе) вы можете архивировать более одного файла.
Роу Гавирел
@RoeeGavirel На сервере я обнаружил утилиту командной строки zip, в которой нет установленного графического инструмента winzip, поэтому я догадался, что этот инструмент CLI поставляется с Windows. С другой стороны, утилиты сжатия Unix / Linux, такие как compress, bzip2 и gzip, создают сжатый файл с тем же именем исходного файла и расширением (.Z, .bz2 или .gz), если вы не передадите имя нужного имени. сжатый файл.
Тулаинс Кордова
-4

Вы можете распаковать сжатый или собственный сжатый файл Windows с помощью команды Expand , например:

expand MyFile.zip myFile
копье
источник
9
Я пробовал это, но он копирует MyFile.zip в папку myFile,
fhnaseer
Это помогло мне C: \> расширить /?
snow6oy
11
Expand работает только с CAB-файлом и не подходит для ZIP-файлов.
рюффп
2
Также и другие комментарии здесь. Expand file.zip fileпросто копирует zip в другой файл без расширения. Он не распаковывает ZIP в папку.
Дейв Марли,