क्या आप केवल Windows की अंतर्निहित क्षमता में फ़ाइलों को ज़िप करने के लिए कमांड प्रॉम्प्ट से किसी फ़ाइल को ज़िप कर सकते हैं?


96

मेरे पास एक बैच फ़ाइल है जो एक टेक्स्ट फ़ाइल को आउटपुट करती है। मैंने सोचा कि अगर मैं इसे भी ज़िप कर सकूं तो अच्छा होगा।

इसका उपयोग अनियंत्रित वातावरण में किया जाएगा, इसलिए मैं तृतीय-पक्ष सॉफ़्टवेयर उत्पादों की उपस्थिति के बारे में धारणा नहीं बना सकता 7-Zip , आदि यह फ़ाइलों को ज़िप करने की क्षमता में विंडोज की अब-निर्मित क्षमता का उपयोग करने की आवश्यकता है।


1
क्या आप Powershell या WSH स्क्रिप्टिंग का उपयोग कर सकते हैं? कमांडलाइन से विंडोज 'बिलिन जिप हैंडलिंग' का उपयोग करने का एकमात्र तरीका हो सकता है। अन्यथा, जैसा कि मौली बताते हैं, आपको 3-पार्टी टूल की आवश्यकता है।
quack quixote

1
तो आप किसी को एक बैच फ़ाइल भेजते हैं और आप उसे कुछ छोटे स्टेटिक रूप से लिंक किए गए gzip.exe नहीं भेज सकते हैं?
akira

ओपी का सवाल एक उत्कृष्ट है (@quackquixote का अजीब आरोप नहीं है)। चूंकि विंडोज SendTo के तहत एक सिंगल क्लिक के रूप में यह प्रदान करता है, वहाँ चाहिए BAT फ़ाइल में प्रयोग करने योग्य कमांड होना। तो यह एक अच्छा सवाल है, भले ही जवाब न हो और तीसरे पक्ष के उपकरण का उपयोग करने के लिए (हास्यास्पद) रिसॉर्ट का उपयोग करना हो जो समकक्ष हो सकता है या नहीं भी हो सकता है।
Jon Coombs

ये है संपर्क टॉमस द्वारा एक फ़ोल्डर की सामग्री को पिन करने के लिए एक अच्छी तरह से लिखित स्क्रिप्ट है। इसे काम करने के लिए बस स्क्रिप्ट को एक बैच फ़ाइल में कॉपी करें और फ़ोल्डर को ज़िप्ड (स्रोत) निर्दिष्ट करके इसे निष्पादित करें। गंतव्य निर्देशिका का उल्लेख करने की आवश्यकता नहीं है क्योंकि यह स्क्रिप्ट में डेस्कटॉप पर डिफ़ॉल्ट है ("% USERPROFILE% \ डेस्कटॉप")
Abhijeet

2
सबसे सरल होगा, एक cmd प्रॉम्प्ट में: powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip (यह फ़ोल्डर के साथ भी काम करता है)
ThomasGuenet

जवाबों:


83

यहाँ एक सभी बैच फ़ाइल समाधान (मेरे अन्य उत्तर की एक भिन्नता) है जो नाम की फ़ाइल को ज़िप करेगा c:\ue_english.txt और इसे अंदर डालें 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

में संग्रहीत फ़ोल्डर के माता-पिता तक लिखने की पहुंच आवश्यक है TEMPDIR। के रूप में यह अक्सर ड्राइव सी की जड़ के लिए मामला नहीं है TEMPDIR बदलना पड़ सकता है।

फ़ोल्डर के लिए लिखें एक्सेस भी आवश्यक है .bat स्क्रिप्ट में है (क्योंकि यह एक फ़ाइल वहाँ उत्पन्न करता है)।

इसके अलावा, कृपया ध्यान दें कि संपीड़ित फ़ाइल के लिए फ़ाइल एक्सटेंशन होना चाहिए .zip। किसी अन्य एक्सटेंशन का उपयोग करने का प्रयास करने पर स्क्रिप्ट त्रुटि हो सकती है। इसके बजाय, उत्पन्न करें .zip फ़ाइल और नाम बदलें।


3
@quack मैं कुछ अस्पष्ट कमांड की उम्मीद में पकड़ रहा था जिसके बारे में मुझे नहीं पता था। मैं देख सकता हूँ कि आप कैसे पा सकते हैं कि एक कठिन आवश्यकता यदि किसी के पास नहीं है, इसका मतलब किसी को बाहर रखना नहीं है।
Aaron Bush

@PeterMortensen: यह देखना दिलचस्प हो सकता है या नहीं कि यह पॉवर्सशेल के साथ कितना सरल है। यहाँ एक 5 लाइन उदाहरण है , लेकिन वहाँ भी मौजूद है एक write-zip cmdlet जिसे डाउनलोड किया जा सकता है Pscx
Tom Wijsman

मैंने ज़िप को संतुष्ट करने के लिए zip.exe और cywin1.dll (3mb) का उपयोग किया और कुछ बैच कोड का उपयोग करने की ज़िप से ही एक लाइन ... का उपयोग होता है। मुझे पता है कि argv के साथ php bancompile'd का उपयोग कर सकते हैं और इसके लिए एक फाइल पास कर सकते हैं। अच्छा लग रहा है। "विंडोज़ कमांड लाइन से एक ज़िप" एक पुरानी विज्ञान कथा फिल्म है, है ना?
erm3nda

हमें एक अस्थायी फ़ोल्डर का उपयोग क्यों करना है TEMPDIR? मुझे लगता है कि आपका इरादा फ़ाइल को लपेटना है FILETOZIP एक फ़ोल्डर द्वारा सही?
Nam G VU

@Peter Mortensen, मुझे पता है कि यह एक पुराना धागा है, और यह लगभग वही है जो मैं देख रहा हूँ। क्या एक बड़ी फ़ाइल को छोटे विखंडू में संपीड़ित करने का विकल्प है?
JohnG

36

यह है किसी भी अतिरिक्त की स्थापना के बिना फ़ाइलों को ज़िप करने के लिए संभव है सॉफ्टवेयर (मैं यह परीक्षण किया है)। समाधान है:

ज़िप फ़ाइल बनाने के लिए कमांड-लाइन विंडो में इसे चलाएं नामित C:\someArchive.zip फ़ोल्डर में सभी फ़ाइलों से युक्त C:\test3:

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

फ़ाइल कहाँ 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 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

मैंने इसे ऐसे रास्तों और फ़ाइल नामों के लिए परीक्षण नहीं किया है जिनमें रिक्त स्थान हैं। यदि उद्धरण हो तो यह काम कर सकता है कमांड लाइन के मापदंडों के आसपास लगाए जाते हैं।


यह कैसे काम करता है: विंडोज (विंडोज एक्सपी और बाद में?) में अंतर्निहित ज़िप कार्यक्षमता है के माध्यम से उजागर कॉम विंडोज शेल से इंटरफेस , explorer.exe - वह "Shell.Application" भाग है। यह COM इंटरफ़ेस एक से इस्तेमाल किया जा सकता है VBScript लिपि क्योंकि ऐसी स्क्रिप्ट COM घटकों को एक्सेस कर सकती है। स्क्रिप्ट को पूरी तरह से आत्म-निहित बनाने के लिए आरंभ करने के लिए एक खाली ज़िप फ़ाइल (एक भी खाली ज़िप फ़ाइल बना सकता है और इसे VBScript स्क्रिप्ट के साथ लक्ष्य प्रणाली में कॉपी कर सकता है)।

VBScript को हर डेस्कटॉप में डिफ़ॉल्ट रूप से स्थापित किया गया है विंडोज 98 के बाद से माइक्रोसॉफ्ट विंडोज की रिलीज।

CScript.exe विंडोज स्क्रिप्ट होस्ट का हिस्सा है। विंडोज स्क्रिप्ट होस्ट विंडोज 98 और बाद के संस्करणों पर डिफ़ॉल्ट रूप से वितरित और स्थापित किया जाता है। यदि Internet Explorer 5 (या बाद का संस्करण) स्थापित है, तो यह भी स्थापित है।


1
+1 अच्छा समाधान जो "जस्ट रन" होगा, लेकिन मैं सूचीबद्ध नहीं किए गए कई अन्य कारणों के लिए बैट का चयन करता हूं। तो मैं एक बैट समाधान पसंद करेंगे।
Aaron Bush

4
@ ऐरॉन बुश: यह स्क्रिप्ट और बीनर दोनों एक कमांड प्रदान करते हैं जो कमांडलाइन पर एक फाइल ज़िप करता है, जो अनुरोध के अनुसार विंडोज़ बिलिन फ़ंक्शन का उपयोग करता है। आप किसी अन्य की तरह उस कमांड को बैच फ़ाइल में जोड़ सकते हैं।
quack quixote

ध्यान दें कि जिन रास्तों से गुजरना है वह निरपेक्ष होना चाहिए, सापेक्ष नहीं। मुझे यहाँ उत्तर में तकनीकों का भी उपयोग करना था: stackoverflow.com/q/1645843/99640
Chuck Wilbur

पथों को निरपेक्ष होना पड़ता है और यह बेतरतीब ढंग से विफल होने लगता है :(
kixorz

इसे उत्तर के रूप में चुना जाना चाहिए।
The Duke Of Marshall שלום

12

यदि आप उपयोग करने के लिए खुले हैं शक्ति कोशिका , ज़िप क्षमताएँ .NET 2.0 में उपलब्ध हैं (PowerShell .NET है)। यहाँ एक उदाहरण है ( स्रोत ) माइक हॉडनिक को श्रेय :

########################################################
# 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)}

यह मूल रूप से अन्य उत्तरों में CScript कोड के समान है। कोई .NET सुविधाओं का उपयोग किया जाता है (और .NET के पास वैसे भी ज़िप समर्थन नहीं है)। मुझे लगता है कि यह समय के मुद्दे के प्रति संवेदनशील भी हो सकता है।
Robert Schmidt

2
.NET System.IO.Compression.ZipFile वर्ग 4.5 संस्करण में जोड़ा गया था।
Concrete Gannet

7

आप संपीड़न संवाद खिड़की के अस्तित्व के लिए मतदान के दौरान संपीड़न के दौरान समय के जोखिम को समाप्त कर सकते हैं। यह विधि संपीड़न विंडो से रद्द करने वाले उपयोगकर्ता को भी संभालती है।

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। उन कोड बंदर शैली " .Sleep(whatever) " मेरी तबियत खराब कर देते हैं।
ivan_pozdeev

1
यदि मैं प्रतीक्षा के लिए उपरोक्त तर्क के साथ एक vbs चला रहा हूं, तो इसे कैसे निर्धारित कार्य के माध्यम से लॉन्च किया जाएगा (जहां कोई उपयोगकर्ता भौतिक रूप से लॉग इन नहीं है)।
Wes

4

यदि आप स्थापित करने में सक्षम हैं संसाधन किट उपकरण , आपको एक कमांड लाइन टूल मिलेगा जिसे COMPRESS कहा जाता है जो ज़िप की तरह संपीड़ित आर्काइव फाइल बना सकता है।

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.

2
+1 वास्तव में चीजों को हल नहीं करता है, लेकिन फिर भी इसके बारे में जानना अच्छा है।
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

वास्तव में मैं क्या देख रहा था .. लेकिन यह मुझे एक त्रुटि देता है "खाली ज़िप फ़ाइल पर लापता"
Sonic Soul

किसी कारण से यह कभी नहीं बढ़ा, अगर मैं प्रिंट करता हूं objShell.NameSpace( ZipFile ).Items.Count लूप के अंदर, यह हमेशा 0 होता है, भले ही ज़िप फ़ाइल बनाई गई हो और इसके अंदर अपेक्षित सामग्री हो ...
Thom Nichols

2

सरलीकृत कोड के साथ कई फाइलें / निर्देशिका।

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

zip.vbs फ़ाइल

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

यह स्वीकृत उत्तर का एक म्यूटेशन है। मैं एक समय में हजारों फ़ाइलों पर एक टन स्वचालन कार्य करता हूं, इसलिए मैं सिर्फ 2 सेकंड के लिए सो नहीं सकता और इसके बारे में परवाह नहीं कर सकता। मैंने वर्कअराउंड को चमकाया यहाँ , जो कि जिउ कोइकारा के जवाब के समान है यहाँ

यह गंतव्य फ़ोल्डर को हर 200ms पर पिंग करने का कारण होगा, जो लगभग उतना ही तेज़ है जितना Microsoft एफएस अपडेट की जांच करने के लिए कहता है।

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

यहाँ सम्पीडन और असम्बद्धता के लिए अंतर्निहित क्षमताओं की खिड़कियों को संक्षेप में प्रस्तुत करने का मेरा प्रयास है - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

कुछ दिए गए समाधानों के साथ जो लगभग हर विंडोज़ मशीन पर काम करना चाहिए।

के संबंध में shell.application और WSH मैंने पसंद किया jscript जैसा कि यह एक हाइब्रिड बैच / jscript फ़ाइल (.bat एक्सटेंशन के साथ) की अनुमति देता है, जिसमें अस्थायी फ़ाइलों की आवश्यकता नहीं होती है। मैंने एक फ़ाइल में अनज़िप और ज़िप क्षमताओं को कुछ और सुविधाओं के साथ रखा है।


0

यदि विंडोज 8 या विंडोज सर्वर 2012 पर आपके पास पावरशेल और .NET 4.5 होगा तो आप ऐसा कर सकते हैं:

zip.ps1 (उपयोग: -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 (यदि आपको आपके लिए PowerShell को कॉल करने के लिए सहायक की आवश्यकता है, तो निर्देशिका पहला तर्क है और दूसरा नाम ज़िप):

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

-5

विंडोज कमांड लाइन अब कॉम्पैक्ट कमांड प्रदान करती है, जो कि जहां तक ​​मैं बता सकता हूं, विंडोज का मूल निवासी है। जब तक मैं कुछ याद नहीं किया अनुरोधों को पूरा करना चाहिए।


8
compact XP के बाद से मौजूद है और NTFS संपीड़न का प्रबंधन करने के लिए एक उपकरण है
Der Hochstapler
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.