Komut satırından .zip klasörü oluşturun - (Windows)


57

Komut satırında bir klasörden bir .zip dosyası oluşturmak mümkün mü, herhangi bir üçüncü taraf çalıştırılabilir kullanmak istemiyorum.

'Sıkıştırılmış klasöre gönder' gibi bir şey düşünüyordum ama nasıl yapılacağını bilmiyorum ...


2
Windows kaynak setinde bir araç var compress.exe.
saat

2
İşte tam olarak bu konuyu tartışan bir ServerFault sorusuna bir link: serverfault.com/questions/39071/…
ho1

Yanıtlar:



7

Windows'a yerleşik ZIP dosyaları için bir komut satırı olduğunu sanmıyorum ( compressServer 2003 Kaynak Seti dışında). Üçüncü bir parti kullanmak zorunda kalacaksın. Herkes 7zip sever !


6

Bu senaryo benim ihtiyaçlarımı daha iyi karşılamak için çeşitli kaynaklardan birleştirdim. Komut dosyasını kopyalayıp ".vbs" uzantılı bir dosyaya yapıştırın. Betik aslen Windows XP için yapilmistir, ancak Windows 7 x64 Ultimate'da da çalisir - Windows'un bu kullanilan çeşitli Shell objelerini doyurmayacağinin garantisi yoktur.

Kullanımı: run kutusuna veya komut satırına koy-

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

Komut dosyası yolu, kaynak klasör, zip dosyası oluşturmak (sonunda .zip dahil).

Boş klasörleri kopyalamaz, bu yüzden dikkatli olun.

İşte vbs kodu ---

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
Umut verici gözüküyor, ancak 16 satırında bir "Nesne gerekli: 'objApp.NameSpace (...)' hatası
aldım

Bende de aynı problem var. Yukarıdaki kod işe yaramıyor veya posterin bahsetmeyi unuttuğu sistemde bazı ekstra şeyler gerekiyor.
Shaamaan

WScript (vbs ortamı) ve birkaç Shell nesnesi kullanır. Hepsi Windows XP (business?) Ve Win 7 Ultimate x64'te varsayılan olarak kuruldu. Belki de Win8 için daha uzun süredir oradalar?
WSkid

2

PowerShell betiğini BAT'dan çalıştırmak mümkündür. Yarasa dosya sıkıştırılmış dir dizinine yol alır ve dosya adını parametre olarak sıkıştırır.

@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
Fakat bu yaklaşımın avantajı ne olurdu? Neden sadece PowerShell betiğini sabit bir dosyaya yazıp parametreleri kabul etmesine izin vermiyor?
Seth

Diğer tüm çözümleri denedim. bu kusursuz çalışan tek güvenli çözümdür. En önemli avantaj, powershell'in yerel komutlarının kullanılması ve eski teknoloji VBScript'in oluşturulmasına gerek yoktur.
desmati

Bu benim için 2019’da eski bir kurumsal windows7 dizüstü bilgisayarda çalıştı.
simbo1905

1

Windows yerel komutlarını kullanarak bir dosyanın nasıl sıkıştırılacağını gösteren harika bir bağlantı.

SADECE Windows'un sıkıştırılmış dosyaları sıkıştırma özelliğini kullanarak komut isteminden bir dosyayı sıkıştırabilir misiniz?

Birden fazla iç içe geçmiş dosya ve klasör içeren bir dizinle test ettim ve mükemmel çalıştı. Sadece komut satırının formatını takip edin.

Dosyaları bulduğum komut satırından da açmanın bir yolu var. Bir yol, sadece sıkıştırılmış dosyanın içeriğinin ne olduğunu gösteren bir gezgin penceresi açar. Bunlardan bazıları, pencere için mutlaka yerel olmayan ancak neredeyse göründüğü kadar yaygın olan Java kullanıyor.

Windows 7, varsayılan olarak yüklenen komut satırında unzip içeriyor mu?

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


3
Cevabınıza talimatları eklemelisiniz. Linkler bayat giderseniz, Cevabınız değersiz olacak ...
MoonSire

1

Bu eski bir soru, ancak alaka düzeyi hala güncel.

Elbette, Windows zip dosyalarını kullanmak için kendi sıkıştırma algoritmasına sahiptir, ancak burada bulunan 7zip açık kaynaklı ürüne kıyasla gerçekten düşük performans gösterir: http://www.7-zip.org/

Diğerleri zaten yerleşik Windows işlevlerini kullanmanın çeşitli yöntemlerini tartıştılar, benim çözümümün ek yazılımı yüklemesini gerektiriyor.

7Zip, ZIP, RAR, CAB ve ISO dahil olmak üzere çok çeşitli dosyaları ve kendi 7z formatlarını destekler.

Komut satırı yardımını görüntüleyebilirsiniz: "C: \ Program Files \ 7-Zip \ 7z.exe" --help

zip arşivine basit bir ekleme yapmak için:

"C: \ Program Files \ 7-Zip \ 7z.exe" bir dosya adı.zip c: \ path


1

İşte 4 farklı kaynaktan, başka bir fikir; fikirlerim değil, ama benim için çalışmasını sağlamak için onları derledim

<!-- : 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
Süper Kullanıcıya Hoşgeldiniz ! Bu açıkça karmaşık bir senaryo. Ne yaptığını ve nasıl kullanılacağını açıklayabilir misiniz?
Jpaugh

1

Bir powershell penceresi açmadan OLMADAN Komut İstemi'ndeki aynı klasörü sıkıştırmak istediğinizi hayal edin:

powershell Compress-Archive . publish.zip

Yaptığım şey bu değildi, ama şimdi benim için işe yarayacak. Bunu bilmek kullanışlı bir numara.
bballdave025

0

Ne yazık ki yorum işlevini kullanamadığım için WSkids yanıtıyla ilgili bir şey yayınlayacağım .

VBS’de CopyHere () yönteminin kullanılması çeşitli sorunları ortaya çıkarmaktadır. Bu sorunlardan biri, kopyalama işlemi arka planda başlarken yöntemin derhal geri dönmesi, buna karşılık birden fazla CopyHere () çağrısı birbirini etkileyecek ve ZIP doğru şekilde oluşturulmayacak olmasıdır. Bunu düzeltmek için burada bir bekleme döngüsü gereklidir. Bekleme döngüm burada yayınlanan benzer bir sorunun cevabına dayanıyor .

İşte pihentagy tarafından bildirilen "Nesne gerekli" hatasını düzelten güncellenmiş bir sürüm . Yeni oluşturulan ZIP dosyası, komut dosyası hızlı makinelerde çalıştırıldığında Öğeler koleksiyonuna dahil edildiğinden bu bir zamanlama sorunudur.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.