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


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

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


93
2018-02-19 19:46


मूल


क्या आप पावरहेल या डब्ल्यूएसएच स्क्रिप्टिंग का उपयोग कर सकते हैं? यह कमांडलाइन से विंडोज़ 'बिल्टिन ज़िप हैंडलिंग का उपयोग करने का एकमात्र तरीका हो सकता है। अन्यथा, जैसा कि मौली बताती है, आपको तीसरे पक्ष के टूल की आवश्यकता है। - quack quixote
तो आप किसी को बैच फ़ाइल भेजते हैं और आप उसे कुछ छोटे स्टेटिक रूप से जुड़े gzip.exe नहीं भेज सकते हैं? - akira
ओपी का सवाल एक उत्कृष्ट है (@quackquixote के अजीब आरोप के बावजूद)। चूंकि विंडोज इसे SendTo के तहत एक क्लिक के रूप में प्रदान करता है, वहां चाहिए बीएटी फ़ाइल में उपयोग करने योग्य कमांड बनने के लिए। तो यह एक अच्छा सवाल है भले ही उत्तर नहीं है और किसी को एक (तृतीय पक्ष) उपकरण का उपयोग करने का सहारा लेना है जो समकक्ष हो सकता है या नहीं। - Jon Coombs
ये है संपर्क टॉमस द्वारा एक फ़ोल्डर की सामग्री ज़िप करने के लिए एक अच्छी तरह लिखित लिपि है। इसे काम करने के लिए बस स्क्रिप्ट को बैच फ़ाइल में कॉपी करें और फ़ोल्डर को ज़िप (स्रोत) के रूप में निर्दिष्ट करके इसे निष्पादित करें। गंतव्य निर्देशिका का उल्लेख करने की आवश्यकता नहीं है क्योंकि इसे स्क्रिप्ट में डेस्कटॉप ("% USERPROFILE% \ डेस्कटॉप") में डिफॉल्ट किया गया है - Abhijeet
एक cmd प्रॉम्प्ट में सबसे आसान होगा: powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip (यह फ़ोल्डर के साथ भी काम करता है) - ThomasGuenet


जवाब:


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


81
2018-02-22 17:28



@quack मैं कुछ अस्पष्ट कमांड की आशा में बाहर था जो मुझे नहीं पता था। मैं देख सकता हूं कि आप कैसे पा सकते हैं कि अगर कोई अस्तित्व में नहीं है तो मुश्किल आवश्यकता है, किसी को भी बाहर रखने का मतलब नहीं था। - Aaron Bush
@ पीटर मॉर्टेंसन: यह देखने के लिए दिलचस्प हो सकता है कि यह पावरहेल के साथ कितना सरल है। यहां 5 लाइन उदाहरण है, लेकिन वहां भी मौजूद है write-zip cmdlet जिसे से डाउनलोड किया जा सकता है Pscx। - Tom Wijsman
मैंने ज़िप को संतुष्ट करने के लिए zip.exe और cywin1.dll (3mb) का उपयोग किया और उपयोग एक लाइन है ... ज़िप से कुछ बैच कोड का उपयोग करने के लिए। मुझे पता है कि एक php bancompile'd argv के साथ उपयोग कर सकते हैं और फ़ाइल को पास कर सकते हैं। अच्छा लग रहा है। "विंडोज कमांड लाइन से एक ज़िप" एक पुरानी विज्ञान कथा फिल्म है, है ना? - erm3nda
हमें एक अस्थायी फ़ोल्डर का उपयोग क्यों करना है TEMPDIR? मुझे लगता है कि आपका इरादा फाइल को लपेटना है FILETOZIP एक फ़ोल्डर से सही? - Nam G VU
@ पीटर मोर्टेंसन, मुझे पता है कि यह एक पुराना धागा है, और यह लगभग वही है जो मैं ढूंढ रहा हूं। क्या एक बड़ी फ़ाइल को छोटे हिस्सों में संपीड़ित करने का कोई विकल्प है? - JohnG


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

एक ज़िप फ़ाइल बनाने के लिए इसे कमांड लाइन विंडो में चलाएं नामित 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 - वह "शैल। अनुप्रयोग" भाग है। इस COM इंटरफेस का उपयोग ए से किया जा सकता है VBScript लिपि क्योंकि ऐसी स्क्रिप्ट COM घटकों तक पहुंच सकती है। स्क्रिप्ट को पूरी तरह आत्मनिर्भर बनाने के लिए यह बनाता है शुरू करने के लिए एक खाली ज़िप फ़ाइल (कोई भी एक खाली ज़िप फ़ाइल भी बना सकता है और इसे VBScript स्क्रिप्ट के साथ लक्ष्य प्रणाली में कॉपी कर सकता है)।

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

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


35
2018-02-20 15:48



+1 अच्छा समाधान जो "बस रन" करेगा, लेकिन मैं सूचीबद्ध नहीं होने के कई अन्य कारणों के लिए बीएटी चुनता हूं। तो मैं एक बीएटी समाधान पसंद करेंगे। - Aaron Bush
@ आर्न बुश: यह स्क्रिप्ट और बीनर दोनों एक कमांड प्रदान करते हैं जो अनुरोध के अनुसार विंडोज़ बिल्टिन फ़ंक्शंस का उपयोग करते हुए कमांडलाइन पर एक फ़ाइल ज़िप करता है। आप उस कमांड को बैचफाइल में किसी अन्य की तरह जोड़ सकते हैं। - quack quixote
ध्यान दें कि पारित पथ पूर्ण, रिश्तेदार नहीं होना चाहिए। मुझे यहां जवाब में तकनीकों का भी उपयोग करना पड़ा: stackoverflow.com/q/1645843/99640 - Chuck Wilbur
पथ पूर्ण होना चाहिए और यह यादृच्छिक रूप से असफल लगता है :( - kixorz
इसे उत्तर के रूप में चुना जाना चाहिए। - The Duke Of Marshall שלום


यदि आप उपयोग करने के लिए खुले हैं शक्ति कोशिका, ज़िप क्षमताओं .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)}

11
2018-02-19 21:59



यह मूल रूप से अन्य उत्तरों में सीएसक्रिप्ट कोड जैसा ही है। कोई .NET सुविधाओं का उपयोग नहीं किया जाता है (और .NET के पास ज़िप समर्थन नहीं है)। मुझे संदेह है कि यह समय के मुद्दे पर भी संवेदनशील हो सकता है। - Robert Schmidt
.NET System.IO.Compression.ZipFile क्लास संस्करण 4.5 में जोड़ा गया था। - Concrete Gannet


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

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

7
2017-11-23 00:47



+1। उन कोड बंदर शैली ".Sleep(whatever)" मेरी तबियत खराब कर देते हैं। - ivan_pozdeev
यदि मैं प्रतीक्षा के लिए उपर्युक्त तर्क के साथ एक vbs चला रहा हूं, तो निर्धारित समय के माध्यम से लॉन्च होने पर इसे कैसे संभाला जाएगा (जहां कोई उपयोगकर्ता शारीरिक रूप से लॉग इन नहीं होता है।) - Wes


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

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.

4
2018-02-19 20:29



+1 वास्तव में चीजों को हल नहीं करता है, लेकिन अभी भी जानना अच्छा है। - Aaron Bush


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

3
2017-08-07 07:46



वास्तव में मैं क्या देख रहा था .. लेकिन यह मुझे एक त्रुटि देता है "खाली ज़िप फ़ाइल पर लापता" - Sonic Soul
अगर मैं प्रिंट करता हूं तो किसी कारण से यह कभी भी वृद्धि नहीं करता है objShell.NameSpace( ZipFile ).Items.Count लूप के अंदर, यह हमेशा 0 है, हालांकि ज़िप फ़ाइल बनाई गई है और इसमें अपेक्षित सामग्री है ... - Thom Nichols


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

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
2017-11-05 21:06





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

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

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

2
2018-06-07 21:53