Як можна скопіювати чи скасувати розпакування зі сценарію, використовуючи ТІЛЬКИ вбудовані можливості Windows?


294

У Windows ви можете копіювати деякі файли

правою кнопкою миші → Надіслати наСтиснутий (стислому) папка

І розпакуйте, двічі клацнувши по .zipфайлу, і витягніть файли.

Чи є спосіб застосувати ці здібності із скрипту (.bat-файлу) без необхідності встановлювати сторонне програмне забезпечення ?



16
Ну, мабуть, для того, щоб викликати його з пакетного файлу чи програми. (Ось чому я тут , - намагаємося зробити швидкий .bat файл для «зборки» трохи продукту на веб - сайт , який вимагає, щоб це був зіп файл.)
Jon Кумбс

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


1
Це неправильно, враховуючи, що PS дозволяє це і попередньо встановлено в Windows і доступне через командний рядок.
Ден Аткінсон

4
@DanAtkinson Оновлено. На нього відповіли ще в 2013 році, посилання надало певний шлях VBS. Шлях PS потребує .Net 4.5, який потребує Windows 8 або вище.
Дірібой

Дякуємо за оновлення! Відповідно внесли зміни до мого голосу. :)
Dan Atkinson

6
@MichaelMrozek Добре "командний рядок" загалом відноситься до будь-якого командного рядка, а не конкретно до CMD / COMMAND, а PS, безумовно, є командним рядком, як і bash, sh, rsh на * nix. Але просто піти далі, оскільки ви можете запустити паттерн з командного рядка, і це відповість на питання, навіть якщо ви хочете вірити, що cmd / команда є єдиним командним рядком.
Роберт Маккі

1
Це було можливо ще в 2013 році (без встановлення додаткового програмного забезпечення). Дивіться питання Super User . Це можливо з моменту виходу 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

Чи можемо ми використовувати ці команди для збільшення стиснення? Як зменшити розмір файлу?
Nigel Fds

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

Чи можемо ми використовувати ці команди для збільшення стиснення? Як зменшити розмір файлу?
Найджел Фдс

У мене .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 встановлений через на VM, встановлений звідси: developer.microsoft.com/en-us/microsoft-edge/tools/vms , і це працює. тому я здогадуюсь, що вам не потрібно .NET 4.5
alpha_989

Це найпрактичніше рішення в сучасних системах, воно запише блискавку розміром понад 2 ГБ, тоді як стандартний Powershell "Compress-Archive" не зможе.
Шукри Адамс

135

Якщо у вас встановлена ​​Java, ви можете стиснути до архіву ZIP за допомогою jarкоманди:

jar -cMf targetArchive.zip sourceDirectory

c = Створює новий архівний файл.

M = Вказує, що файл маніфесту не слід додавати до архіву.

f = Вказує ім'я цільового файлу.


3
приголомшливий, спасибі, саме те, що я шукав ... FYI - мені довелося зняти мінус char у DOS ... наприклад jar cMf target.zip sourceDir
mlo55

3
Непогано, але вам потрібно встановити JDK, а не JRE.
pdem

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
    

13
Це чудово працює, дякую. Для всіх, хто закінчується тут, ви можете скористатися powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipпрямо з командного рядка без необхідності складати сценарій (якщо припустимо, що у вас встановлено Powershell v5, що можна зробити, принаймні, повернувшись до Windows 7).
Здається

Чудово працює, додайте опцію -Force, якщо ви плануєте її відновити.
Робін Салих

1
@ Вітаю, дякую! Але я думаю, що ви звели з розуму шлях / пункт призначення навпаки?
Yiping

Це працює, але архів стискається інакше, а що станеться, якщо використовувати провідник Windows "Надіслано -> стиснута (блискавка)" Версія оболонки є більшою і деякі програми не можуть витягнути
Ерік Лабашоський

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

31
Будь ласка, зверніть увагу на питання:without the need to install any 3rd party
Roee Gavirel

16
@RoeeGavirel 7zip має бути однією з перших речей, які ви встановлюєте на будь-якій установці Windows, хоча: P
розробникbmw

3
@developerbmw - А. чому це? B. Я маю на увазі близько 100 машин у виробництві, на яких немає 7zip. Щоб встановити це, я повинен був би змусити DevOps встановити його на всіх тих машинах і на всіх нових машинах, які будуть додані до кластерів. Я б скоріше уникав цього.
Roee Gavirel

1
@Roland: чи можете ви бути просторим; де йде не так? Це допоможе всім.
Монір

1
@Roland: Щойно перевірено, синтаксис працює добре. Можливо, ви намагаєтеся з папкою "foo", якої немає у вашій машині. Просто здогадайтесь, хоча.
Монір

9

Я шукав відповісти на це точне запитання, і з мого дослідження, відповідь DiryBoy здається точним.

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

Я також знайшов compress.exe, який у мене був на комп’ютері. Це не є власне на більшості віконних машин і є частиною набору ресурсів 2003 року. Він робить своєрідний заархівований файл, але він справді більше схожий на файли з диска встановлення Windows (має підкреслення як останній символ розширення або імені файлу). І команда extension.exe витягує ці файли.

Однак мантра полягає в тому, що якщо це можна зробити власно через GUI, то, швидше за все, це можливо зробити через пакет, .vbs або якийсь інший тип скрипту в командному рядку. Оскільки у Windows з'явилася опція "надіслати" для створення zip-файлу, я знав, що повинен бути спосіб зробити це за допомогою командного рядка, і знайшов деякі варіанти.

Ось чудове посилання, яке показує, як зафіксувати файл за допомогою власних команд Windows.

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

Я перевірив його в каталозі, що містить кілька вкладених файлів і папок, і він працював чудово. Просто дотримуйтесь формат командного рядка.

Існує також спосіб розпакувати файли за допомогою командного рядка, який я також знайшов. Один із способів - просто відкрити вікно провідника, яке показує вміст заархівованого файлу. Деякі з них також використовують Java, яка не обов'язково є рідною для Windows, але настільки поширена, що майже здається так.

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

Як розпакувати файл за допомогою командного рядка?



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.


Рядок, який створює початковий zip-файл, повинен бути залишений, інакше він не закінчується в сценарії.
чашка

Так, це саме шлях (наприклад, у питанні Super User ).
Пітер Мортенсен

Як відповідь я додав належну версію.
fsteff

5

У мене проблема з усіма цими рішеннями.

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

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

(Зверніть увагу на -CompressionLevel . Є три можливі значення : Найшвидший, NoCompression & Optimal, (за замовчуванням: Optimal))

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

Але чомусь це не працює з жодним із цих автоматичних компресій, але це працює з ручним стисненням RMB, що мені здається дуже дивним.

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


Що таке "wbr" та "RMB" ?
Пітер Мортенсен

RMB = Кнопка правої миші. <wbr> = тег HTML, який вказує на браузер "Можливість Word BReak" (видалено, оскільки він не працював).
Себастьян Норр

4

Якщо вам потрібно зробити це як частину сценарію, тоді найкращим способом є використання Java. Якщо припустити, що каталог біна стоїть на вашому шляху (у більшості випадків), ви можете використовувати командний рядок:

jar xf test.zip

Якщо Java не на вашому шляху, посилайтеся на неї безпосередньо:

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

3

Відкритий код - ваш друг :-)

Ось розпакуйте : http://gnuwin32.sourceforge.net/packages/unzip.htm

Також є команда ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

Завантажених бінарних файлів достатньо.


У Windows 8 він видає помилку: bzip2.dll відсутній.
Дуг

1
@Doug говорить, що bzip2 - це вимога на сторінці та має посилання для завантаження
Сем

11
Первісне питання полягало в тому, як використовувати стандартні вбудовані команди Windows. Крім того, вимагати від своїх користувачів встановлення різних сторонніх рішень небажано, оскільки ваш власний інструмент чи рішення тепер обмежений користувачами, які мають адміністративний дозвіл на своєму комп’ютері або яким не байдуже зростаюча колекція невеликих залежностей від їхньої системи . Open source може бути вашим другом, але пакети з відкритим кодом, які вимагають встановити інші пакети з відкритим кодом, які вимагають, щоб ви встановили інші пакети з відкритим кодом і так далі, очевидно, не є вашим другом.
Стів Холлаш

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

2

Ви кажете, що намагаєтесь це зробити без стороннього програмного забезпечення. Я не впевнений, чи розглядаєте ви .NET "стороннє" програмне забезпечення.

Але ви можете створити власну утиліту командного рядка в .NET. Він не повинен вимагати більше декількох рядків коду.

Клас ZipFile


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

-4

Щоб скопіювати файл:

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

4
дві речі: (1) "zip" не передбачений вікнами, тому, ймовірно, у вас є третя сторона. і як згадувалося моє запитання, я не можу встановити сторонніх сторін. (2) Причина, що вам потрібно вказати потрібне ім'я, полягає в тому, що в папері створюйте та архівуйте файли (наприклад, папку по сеансу) і у вас може бути більше одного файлу.
Roee Gavirel

@RoeeGavirel На сервері я знайшов утиліту командного рядка zip, не встановлено інструмент графічного інтерфейсу winzip, тому я здогадався, що голий інструмент CLI поставляється разом із Windows. З іншого боку, утиліти для стиснення Unix / Linux на зразок компрес, bzip2 та gzip створюють стислий файл з тим же найменуванням вихідного файлу плюс розширення (.Z, .bz2 або .gz), якщо ви не передасте ім'я потрібного стислий файл.
Тулен Кордова

-4

Ви можете розпакувати стиснутий або натиснутий на стиснутий файл Windows за допомогою команди Expand , наприклад

expand MyFile.zip myFile

9
Я спробував це, але він копіює MyFile.zip у папку myFile,
fhnaseer

Це допомогло мені C: \> розширити /?
snow6oy

11
Розгортання працює лише з .cab файлом, і це не підходить для поштових файлів.
рüффп

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