Створіть .zip папку з командного рядка - (Windows)


54

Чи можливо створити .zip-файл із папки в командному рядку, я не хочу використовувати будь-який виконуваний сторонній файл.

Я думав про щось на кшталт "надіслати в стиснуту папку", але не знаю, як це зробити ...


2
У наборі ресурсів Windows є інструмент під назвою compress.exe.
ho1

2
Ось посилання на питання ServerFault, в якому обговорюється саме це: serverfault.com/questions/39071/…
ho1

Відповіді:



7

Я не думаю, що є командний рядок для ZIP-файлів, вбудованих до Windows (крім, ніж compressу Resource Kit Server 2003). Вам доведеться скористатися третьою стороною. Усі люблять 7zip !


6

Я поєднав цей сценарій з кількох різних джерел, щоб краще відповідати моїм потребам. Скопіюйте та вставте скрипт у файл із розширенням ".vbs". Сценарій спочатку був створений для Windows XP, але він також працює в Windows 7 x64 Ultimate - жодних гарантій, якщо Windows буде тримати навколо різних об'єктів Shell, якими він користується.

Використання: у полі запуску чи командному рядку put-

"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"

Шлях до сценарію, вихідної папки, створення zip-файлу (включити .zip в кінці).

Він не копіює порожні папки, тому будьте обережні.

Ось код vbs ---

Set Args = Wscript.Arguments
source = Args(0)
target = Args(1)

' make sure source folder has \ at end
If Right(source, 1) <> "\" Then
    source = source & "\"
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set zip = objFSO.OpenTextFile(target, 2, vbtrue)
' this is the header to designate a file as a zip
zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )
zip.Close
Set zip = nothing

wscript.sleep 500

Set objApp = CreateObject( "Shell.Application" )
intSkipped = 0

' Loop over items within folder and use CopyHere to put them into the zip folder
For Each objItem in objApp.NameSpace( source ).Items
    If objItem.IsFolder Then
        Set objFolder = objFSO.GetFolder( objItem.Path )
        ' if this folder is empty, then skip it as it can't compress empty folders
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1
        Else
            objApp.NameSpace( target ).CopyHere objItem
        End If
    Else
        objApp.NameSpace( target ).CopyHere objItem
    End If
Next

intSrcItems = objApp.NameSpace( source ).Items.Count
wscript.sleep 250

' delay until at least items at the top level are available
Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems
    wscript.sleep 200
Loop

'cleanup
Set objItem = nothing
Set objFolder = nothing
Set objApp = nothing
Set objFSO = nothing

1
Виглядає багатообіцяюче, але я отримав помилку "ObjectApp.NameSpace (...)" у рядку 16
pihentagy

У мене така ж проблема. Вищевказаний код не працює, або йому потрібні додаткові речі в системі, яку плакат забув згадати.
Shaamaan

Він використовує WScript (vbs-середовище) та кілька об'єктів Shell. Усі були встановлені за замовчуванням у Windows XP (business?) Та Win 7 Ultimate x64. Можливо, вони довше там для Win8?
WSkid

2

Можна запустити скрипт PowerShell від BAT. Файл Bat отримує шлях до dir, який потрібно блискавити, та ім'я файлу zip як параметри.

@echo off
setlocal

rem First parameter - path to dir to be zipped
rem Second parameter- zip file name
set sourceDir=%1
set zipFile=%2

rem Create PowerShell script
echo Write-Output 'Custom PowerShell profile in effect!'    > %~dp0TempZipScript.ps1
echo Add-Type -A System.IO.Compression.FileSystem           >> %~dp0TempZipScript.ps1
echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"
del %~dp0TempZipScript.ps1
endlocal

1
Але яка була б перевага такого підходу? Чому б просто не написати сценарій PowerShell у фіксований файл і дозволити йому приймати параметри?
Сет

Я спробував усі інші рішення. це єдине безвідмовне рішення, яке працює бездоганно. Найважливішою перевагою є використання вбудованих команд powerhell та відсутність необхідності створювати старий технологічний VBScript.
десмати

Це працювало для мене на старому корпоративному ноутбуці Windows7 у 2019 році.
simbo1905

1

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

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

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

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

Чи має Windows 7 розпакування в командному рядку, встановленому за замовчуванням?

https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line


2
Ви повинні включити інструкції у відповідь. Якщо посилання застаріли, ваша відповідь буде нікчемною ...
MoonSire

1

Це давнє питання, але актуальність досі залишається актуальною.

Звичайно, у Windows є власний алгоритм стиснення, вбудований для використання zip-файлів, але він справді погано працює порівняно з 7zip продуктом з відкритим кодом, який можна знайти тут http://www.7-zip.org/

Інші вже обговорювали різні методи використання вбудованих функцій Windows, моє рішення вимагає встановлення додаткового програмного забезпечення.

7Zip підтримує широкий спектр файлів, включаючи ZIP, RAR, CAB та ISO, а також власний 7z формат.

Ви можете переглянути довідку командного рядка: "C: \ Program Files \ 7-Zip \ 7z.exe" --help

виконати просте додавання до zip-архіву:

"C: \ Program Files \ 7-Zip \ 7z.exe" ім'я файлу.zip c: \ path


1

Ось ще одна ідея з 4 різних джерел; не мої ідеї, але я склав їх, щоб змусити мене працювати

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = objArgs(1)

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

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

'Required!
wScript.Sleep 2000
</script></job>
</package>

2
Ласкаво просимо до Супер Користувача ! Це, очевидно, складний сценарій. Чи можете ви пояснити, що це робить, і як це використовувати?
jpaugh

1

Уявіть, що ви хочете стиснути ту саму папку, яку ви знаходитесь у командному рядку БЕЗ відкриття вікна Powerhell:

powershell Compress-Archive . publish.zip

Це я не мав на меті зробити, але це буде працювати для мене зараз. Це зручна хитрість знати.
bballdave025

0

Я опублікую щось, що стосується відповіді WSkids, на жаль, я не можу використовувати функцію коментування.

Використання методу CopyHere () в VBS вводить кілька питань. Одне з цих питань полягає в тому, що метод негайно повертається, коли процес копіювання починається у фоновому режимі, тоді як декілька викликів CopyHere () будуть заважати один одному, а ZIP не буде створений правильно. Тут потрібна петля очікування, щоб виправити це. Мій цикл очікування заснований на відповіді на аналогічне питання, розміщеному тут .

Ось оновлена ​​версія, яка виправляє помилку "Об'єкт необхідний", яку повідомляє pihentagy . Це проблема з тимчасовим часом, оскільки новостворений ZIP-файл входить у колекцію «Елементи», коли сценарій виконується на швидких машинах.

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing

0

Ось моя спроба узагальнити вбудовані вікна можливостей для стиснення та стискання - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -із-партія-ф

з кількома заданими рішеннями, які повинні працювати майже на кожній машині Windows.


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