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?


111

Bir metin dosyası çıktısı toplu iş dosyası var. Ben de kapatabilirsem iyi olacağını düşündüm.

Bu, kontrolsüz bir ortamda kullanılacak, bu yüzden 7-Zip gibi üçüncü taraf yazılım ürünlerinin varlığı hakkında varsayımlarda bulunamıyorum . Bu, Windows'un şimdiki zip dosyalarını sıkıştırma özelliğini kullanması gerekiyor.


1
Powershell veya WSH komut dosyası kullanıyor musunuz? Bu, Windows'un yerleşik zip işlemeyi komut satırından kullanmanın tek yolu olabilir. Aksi takdirde, Molly'nin işaret ettiği gibi, üçüncü taraf bir araca ihtiyacınız vardır.
quack quixote

1
Bu yüzden birine bir toplu iş dosyası gönderirsiniz ve ona küçük bir statik bağlı gzip.exe gönderemezsiniz?
akira

OP'nin sorusu mükemmel bir sorundur (@ququququote'in garip suçlamalarına rağmen). , Windows SendTo altında tek bir tıklama olarak bu sağlamak olduğundan, orada gerektiğini bir BAT dosyası kullanılabilen bir komut olması. Bu nedenle, cevap Hayır ise ve bir kişi (saçma bir şekilde), eşdeğer olabilecek veya olmayabilecek üçüncü taraf bir aracı kullanmak zorunda kalsa bile iyi bir soru.
Jon Coombs

Bu bağlantı Tomas tarafından bir klasörün içeriğini zip için iyi yazılmış senaryo vardır. Çalışması için sadece betiği bir toplu iş dosyasına kopyalayın ve sıkıştırılacak klasörü (kaynak) belirterek çalıştırın. Masaüstü dizininde varsayılan olarak ("% USERPROFILE% \ Desktop") varsayılan olarak hedef dizinden bahsetmeye gerek yok
Abhijeet

3
En basit powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip
olanı

Yanıtlar:


85

İşte adında bir dosyayı sıkıştırıp c:\ue_english.txtiçine koyacak bir toplu iş dosyası çözümü (diğer cevabımın bir çeşitlemesi) C:\someArchive.zip:

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.zip

pause

İçinde saklanan klasörün ebeveyni için yazma erişimi gereklidir TEMPDIR. Bu genellikle C sürücüsünün kökü için geçerli olmadığından, TEMPDIRdeğiştirilmesi gerekebilir.

.batKomut dosyasının bulunduğu klasör için de yazma erişimi gerekir (orada bir dosya oluşturduğundan).

Ayrıca, sıkıştırılmış dosyanın dosya uzantısının olması gerektiğini lütfen unutmayın .zip. Başka bir uzantı kullanmaya çalışmak bir komut dosyası hatasına neden olabilir. Bunun yerine, .zipdosyayı oluşturun ve yeniden adlandırın.


3
@quack Bilmediğim bazı karanlık komutların umuduyla tutuyordum. Biri yoksa, kimseyi dışarıda bırakmak istemediği takdirde zor bir şartı nasıl bulabileceğini görebiliyorum.
Aaron Bush

@PeterMortensen: Bunun Powershell ile ne kadar basitleştirildiğini görmek ilginç olabilir veya olmayabilir. İşte 5 satırlık bir örnek , ancak Pscx'tenwrite-zip indirilebilecek bir cmdlet de var .
Tamara Wijsman

Zip.exe ve cywin1.dll (3mb) ZIP karşılamak için kullandım ve kullanım bir satır ... bazı toplu iş kodu kullanarak zip kendisinden. Argv ile derlenen bir php yasağını kullanabilir ve bir dosya iletebilirim. Kulağa hoş geliyor. "Windows komut satırından bir zip" eski bir bilim kurgu filmi, değil mi?
erm3nda

Neden temp klasörü kullanmalıyız TEMPDIR? Sanırım amacınız dosyayı FILETOZIPbir klasöre sarmak mı?
Nam G VU

@Peter Mortensen, bunun eski bir konu olduğunu biliyorum ve bu neredeyse aradığım şey. Büyük bir dosyayı daha küçük parçalara sıkıştırma seçeneği var mı?
JohnG

38

İse herhangi bir ek yazılım (ben bunu test ettik) yüklemesi olmadan dosyaları sıkıştırmak üzere mümkün. Çözüm şudur:

C:\someArchive.zipKlasördeki tüm dosyaları içeren bir ZIP dosyası oluşturmak için bunu komut satırı penceresinde çalıştırın C:\test3:

CScript  zip.vbs  C:\test3  C:\someArchive.zip

Dosyanın bulunduğu yer zip.vbs:

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

' Create an 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 to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000

Bunu, yollar ve boşluk içeren dosya adları için test etmedim. Tırnaklar komut satırı parametrelerinin etrafına yerleştirilirse işe yarayabilir.


Nasıl çalışır: Windows'taki yerleşik zip işlevi (Windows XP ve üstü?), Windows kabuğundaki COM arayüzleri aracılığıyla gösterilir ; explorer.exe - bu "Shell.Application" kısmıdır. Bu COM arabirimi VBScript kodundan kullanılabilir, çünkü böyle bir komut dosyası COM bileşenlerine erişebilir. Komut dosyasını tamamen bağımsız yapmak için, başlamak için boş bir ZIP dosyası oluşturur (biri boş bir ZIP dosyası da oluşturabilir ve VBScript komut dosyasıyla birlikte hedef sisteme kopyalayabilir).

VBScript, Windows 98’den bu yana Microsoft Windows'un her masaüstü sürümünde varsayılan olarak yüklenmiştir.

CScript.exeWindows Komut Dosyası Sistemi'nin bir parçasıdır . Windows Komut Dosyası Sistemi, Windows 98 ve sonraki sürümlerinde varsayılan olarak dağıtılır ve yüklenir. Internet Explorer 5 (veya sonraki bir sürümü) yüklü ise de yüklenir.


1
+1 "Sadece Çalıştır" olacak iyi bir çözüm, ancak listelenmemiş diğer nedenlerden dolayı BAT'ı seçiyorum. Bu yüzden bir BAT çözümü tercih ederim.
Aaron Bush

4
@Aaron Bush: Bu komut dosyası ve Beaner, istendiği gibi, Windows yerleşik işlevlerini kullanarak komut satırındaki bir dosyayı fermuarlayan bir komut sunar. Bu komutu, diğerleri gibi bir toplu iş dosyasına ekleyebilirsiniz.
quack quixote

Geçilen yolların göreceli değil mutlak olması gerektiğini unutmayın. Buradaki cevaptaki teknikleri de kullanmak zorunda kaldım: stackoverflow.com/q/1645843/99640
Chuck Wilbur

Yollar mutlak olmalı ve rastgele başarısız olmuş gibi görünüyor :(
kixorz

Bu cevap olarak seçilmelidir.
Marshall Dük Duke,

12

PowerShell'i kullanmaya açıksanız , zip yetenekleri .NET 2.0'da kullanılabilir (PowerShell, .NET'tir). İşte Mike Hodnick'e verilen bir örnek ( kaynak ) kredisi :

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}

Bu temelde diğer cevaplarda CScript koduyla aynı şeydir. Hiçbir .NET özelliği kullanılmaz (ve .NET zaten ZIP desteğine sahip değildir). Bunun zamanlama meselesine de duyarlı olabileceğinden şüpheleniyorum.
Robert Schmidt,

2
.NET System.IO.Compression.ZipFile sınıfı, 4.5 sürümünde eklenmiştir.
Beton Gannet

7

Sıkıştırma iletişim penceresinin varlığını sorgulayarak sıkıştırma sırasında zaman aşımı riskini ortadan kaldırabilirsiniz. Bu yöntem aynı zamanda kullanıcıyı sıkıştırma penceresinden iptal etmeyi de yönetir.

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop

1
+1. Bu maymun tarzı " .Sleep(whatever)" beni hasta ediyor.
ivan_pozdeev

1
Beklemek için yukarıdaki mantığa sahip bir vbs çalıştırıyorsam, bu zamanlanmış bir görevle (fiziksel olarak oturum
açmamış

5

Kaynak Seti Araçlarını yükleyebiliyorsanız, zip gibi sıkıştırılmış arşiv dosyaları oluşturabilen COMPRESS adlı bir komut satırı aracı bulacaksınız.

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Rename compressed files.
  -d            Update compressed files only if out of date.
  -zx           LZX compression.
  -z            MS-ZIP compression.
  -zq[n]        Quantum compression and optional level
                (in range 1-7, default is 4).
  Source        Source file specification.  Wildcards may be used.
  Destination   Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.

3
+1 Bir şeyleri gerçekten çözmüyor, ancak hala bilmesi gerekenler.
Aaron Bush

3
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop

tam olarak ne aradım .. ama bana "boş Zip dosyasında eksik" bir hata veriyor
Sonic Soul

Bazı nedenlerden dolayı, bu hiç bir zaman artmaz, objShell.NameSpace( ZipFile ).Items.Countdöngü içinde yazdırırsam , zip dosyası oluşturulmuş olsa ve içeriğinde beklenen içeriğe sahip olsa bile her zaman 0 olur ...
Thom Nichols

2

Basitleştirilmiş kod ile birden fazla dosya / dizin.

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

zip.vbs dosyası

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next

2

Bu, kabul edilen cevabın bir mutasyonudur. Bir seferde binlerce dosyaya kadar tonlarca otomasyon işlemi yapıyorum, bu yüzden sadece 2 saniye uyuyamıyorum ve umursamıyorum. Jiří Kočara'nın buradaki cevabına benzeyen geçici çözümü burada da topladım .

Bu, hedef klasörün her 200ms'de bir ping yapmasına neden olacaktır; bu, Microsoft'un FS güncellemelerini kontrol etmek için söylediği kadar hızlıdır.

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop

1

İşte sıkıştırma ve sıkıştırmasındaki yerleşik pencereleri özetleme girişimi - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -ile-parti-f

hemen hemen her pencere makinesinde çalışması gereken birkaç çözüm.

Açısından şöyle shell.application ve WSH ı tercih JScript o (.bat uzantılı) bir hibrit toplu / JScript dosyası izin verdiği tek bir dosyada artı biraz daha fazla özellik unzip ve posta yeteneklerini koymak files.I've temp gerektirmeyen bu .


0

Windows 8 veya Windows Server 2012'de PowerShell ve .NET 4.5'e sahipseniz, bunu yapabilmeniz için:

zip.ps1 (kullanım :)-directory <directory to zip up> -name <zip name> :

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat (sizin için PowerShell'i çağırmak için bir yardıma ihtiyacınız varsa, dizin ilk argümandır ve zip adı ikincidir):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"

0

Windows 10, 17063 veya sonraki sürümlerde, komut satırından zip ile çalışabilen tar.exe ile birlikte gelir.

tar.exe -xf archive.zip

veya arşiv oluşturmak için

tar.exe -cf Test.zip Test

-5

Windows komut satırı şimdi söyleyebildiğim kadarıyla Windows'a özgü olan kompakt komutu sağlıyor. Bir şeyi kaçırmadığım sürece istenen şartları yerine getirmeli.


9
compactXP’den bu yana var olan ve NTFS sıkıştırmasını yöneten bir araçtır
Der Hochstapler 31.03.2013
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.