Buat folder .zip dari baris perintah - (Windows)

57

Apakah mungkin untuk membuat file .zip dari folder di baris perintah, saya tidak ingin menggunakan pihak ketiga yang dapat dieksekusi.

Saya sedang memikirkan sesuatu seperti 'kirim ke folder terkompresi' tetapi saya tidak tahu bagaimana melakukannya ...

Steven Penny
sumber
2
Ada alat dalam kit sumber daya Windows yang disebut compress.exe.
ho1
2
Berikut ini tautan ke pertanyaan ServerFault yang membahas hal ini: serverfault.com/questions/39071/…
ho1

Jawaban:

7

Saya tidak berpikir ada baris perintah untuk file ZIP yang dibangun ke Windows (Selain compressdi Server 2003 Resource Kit). Anda harus menggunakan pihak ketiga. Semua orang suka 7zip !

EMMERICH
sumber
6

Saya telah menggabungkan skrip ini dari beberapa sumber yang berbeda agar sesuai dengan kebutuhan saya dengan lebih baik. Salin dan rekatkan skrip ke file dengan ekstensi ".vbs". Script ini awalnya dibuat untuk Windows XP, tetapi juga berfungsi di Windows 7 x64 Ultimate - tidak ada jaminan jika Windows akan menyimpan berbagai objek Shell yang digunakannya.

Penggunaan: dalam kotak run atau put-line perintah

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

Path ke skrip, folder sumber, file zip untuk membuat (termasuk .zip di akhir).

Itu tidak akan menyalin folder kosong jadi hati-hati.

Berikut adalah kode 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
WSkid
sumber
1
Terlihat menjanjikan, tapi saya mendapat "Objek yang diperlukan: kesalahan 'objApp.NameSpace (...)' pada baris 16
pihentagy
Saya memiliki masalah yang sama. Kode di atas tidak berfungsi, atau perlu beberapa hal tambahan dalam sistem yang lupa disebutkan oleh poster.
Shaamaan
Ini menggunakan WScript (lingkungan vbs) dan beberapa objek Shell. Semua diinstal secara default di Windows XP (bisnis?) Dan Win 7 Ultimate x64. Mungkin mereka lebih lama di sana untuk Win8?
WSkid
2

Dimungkinkan untuk menjalankan skrip PowerShell dari BAT. File bat menerima jalur untuk dir untuk di-zip dan nama file zip sebagai parameter.

@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
cam029
sumber
1
Tetapi apa yang akan menjadi keuntungan dari pendekatan ini? Mengapa tidak menulis skrip PowerShell ke file yang diperbaiki dan membiarkannya menerima parameter?
Seth
Saya mencoba semua solusi lain. ini adalah satu-satunya solusi gagal-aman yang bekerja dengan sempurna. Keuntungan yang paling penting adalah penggunaan perintah asli PowerShell dan tidak perlu membuat VBScript teknologi lama.
desmati
Ini bekerja untuk saya pada laptop windows7 perusahaan lama pada tahun 2019.
simbo1905
1

Berikut ini adalah tautan bagus yang menunjukkan bagaimana cara zip file menggunakan perintah windows asli.

Bisakah Anda zip file dari command prompt menggunakan HANYA kemampuan built-in Windows untuk zip file?

Saya mengujinya dengan direktori yang berisi banyak file dan folder bersarang dan itu berfungsi dengan baik. Cukup ikuti format baris perintah.

Ada juga cara untuk unzip file melalui command line yang saya temukan juga. Salah satu caranya, cukup buka jendela explorer yang menunjukkan konten file yang di-zip. Beberapa dari ini juga menggunakan Java yang tidak selalu asli ke windows tetapi sangat umum sehingga hampir tampak begitu.

Apakah Windows 7 memiliki unzip di baris perintah yang diinstal secara default?

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

LostUser
sumber
3
Anda harus memasukkan instruksi dalam jawaban Anda. Jika
tautannya menjadi usang
1

Ini adalah pertanyaan lama, tetapi relevansinya masih terkini.

Windows tentu saja memiliki algoritma kompresi sendiri bawaan untuk menggunakan file zip, tetapi, itu benar-benar berkinerja buruk bila dibandingkan dengan produk open source 7zip yang ditemukan di sini http://www.7-zip.org/

Yang lain sudah membahas berbagai metode untuk menggunakan fungsi built in windows, solusi saya perlu menginstal perangkat lunak tambahan.

7Zip mendukung berbagai file, termasuk ZIP, RAR, CAB dan ISO dan formatnya sendiri 7z.

Anda dapat melihat bantuan baris perintah: "C: \ Program Files \ 7-Zip \ 7z.exe" --help

untuk melakukan penambahan sederhana ke arsip zip:

"C: \ Program Files \ 7-Zip \ 7z.exe" a filename.zip c: \ path

Dwight Wilbanks
sumber
1

Ini ide lain, dari 4 sumber berbeda; bukan ide-ide saya, tetapi saya menyusunnya untuk membuatnya bekerja untuk saya

<!-- : 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>
eyeH8bingDotCom
sumber
2
Selamat Datang di Pengguna Super ! Ini jelas skrip yang rumit. Bisakah Anda menjelaskan apa fungsinya, dan bagaimana menggunakannya?
jpaugh
1

Bayangkan Anda ingin mengompres folder yang sama dengan yang ada di Command Prompt TANPA membuka jendela PowerShell:

powershell Compress-Archive . publish.zip
Wagner Bertolini Junior
sumber
Bukan itu yang ingin saya lakukan, tetapi itu akan berhasil bagi saya sekarang. Itu trik yang mudah diketahui.
bballdave025
0

Saya akan memposting sesuatu yang berhubungan dengan jawaban WSkids karena sayangnya saya tidak dapat menggunakan fungsi komentar.

Menggunakan metode CopyHere () di VBS memperkenalkan beberapa masalah. Salah satu masalah ini adalah bahwa metode kembali segera saat proses penyalinan dimulai di latar belakang sedangkan beberapa panggilan CopyHere () akan saling mengganggu dan ZIP tidak akan dibuat dengan benar. Lingkaran tunggu diperlukan di sini untuk memperbaikinya. Lingkaran tunggu saya didasarkan pada jawaban untuk masalah serupa yang diposting di sini .

Berikut adalah versi terbaru yang memperbaiki kesalahan "Objek diperlukan" yang dilaporkan oleh pihentagy . Ini masalah waktu karena file ZIP yang baru dibuat dimasukkan dalam koleksi Item saat skrip dieksekusi pada mesin cepat.

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
ViRuSTriNiTy
sumber