Как вы можете zip или разархивировать из script, используя встроенные возможности ONLY Windows?

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

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

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

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

Ответ 1

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

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

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

Ответ 2

Чтобы расширить решение Steven Penny 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.

Ответ 3

Начиная с .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 для сохранения или распаковки.

Ответ 4

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

jar -cMf targetArchive.zip sourceDirectory

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

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

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

Ответ 5

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
    

Ответ 6

Это не совсем 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 расширенного использования

Ответ 7

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

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

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

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

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r

Ответ 8

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

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

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

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

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

https://superuser.com/questions/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

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

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

https://superuser.com/questions/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

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

Ответ 9

Вы можете использовать скрипт 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.

Ответ 10

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

jar xf test.zip

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

C:\Java\jdk1.6.0_03\bin>jar xf test.zip

Ответ 12

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

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

Класс ZipFile

Ответ 13

Это обновленная версия ответа, предоставленного @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

Ответ 14

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

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

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

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

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

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

Ответ 15

ZipFile="C:\Users\spvaidya\Music\folder.zip"
ExtractTo="C:\Users\spvaidya\Music\"



'If the extraction location does not exist create it.
Set fso = CreateObject("Scripting.FileSystemObject")
If NOT fso.FolderExists(ExtractTo) Then
   fso.CreateFolder(ExtractTo)
End If

'Extract the contants of the zip file.
set objShell = CreateObject("Shell.Application")
set FilesInZip=objShell.NameSpace(ZipFile).items
objShell.NameSpace(ExtractTo).CopyHere(FilesInZip)
Set fso = Nothing
Set objShell = Nothing

Это VBSCRIPT. Вы можете сохранить это как file.vbs и запустить его, используя пакетный скрипт, как

file.vbs

сохраните это в файле .bat и запустите.

Ответ 16

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

expand MyFile.zip myFile

Ответ 17

Чтобы закрепить файл:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 максимальное сжатие
  • -m удалить исходный файл после успешного сжатия
  • -o установить дату изменения zip файла так же, как исходный файл
  • слишком плохо, нужно дать ему имя желаемого zip файла вместо него, просто добавив расширение .zip к имени файла для сжатия