2008-08-27 17 views
53

क्या ज़िप संपीड़न है जिसे Windows XP/Vista/2003/2008 में बनाया गया है, जिसे स्क्रिप्ट किया जा सकता है? बीएटी/सीएमडी फाइल से मुझे क्या निष्पादन योग्य कॉल करना होगा? या वीबीस्क्रिप्ट के साथ ऐसा करना संभव है?क्या विंडोज़ का अंतर्निहित ज़िप संपीड़न स्क्रिप्ट किया जा सकता है?

मुझे एहसास है कि यह WinZip, 7-Zip और अन्य बाहरी अनुप्रयोगों का उपयोग कर संभव है, लेकिन मैं ऐसा कुछ ढूंढ रहा हूं जिसके लिए कोई बाहरी अनुप्रयोग स्थापित नहीं होना चाहिए।

+0

Google पर उपलब्ध विभिन्न वीबीस्क्रिप्ट कार्यान्वयन हैं, उदा। "[विंडोज शैल (एक्सपी, विस्टा, 2003 और 2008) और वीबीस्क्रिप्ट का उपयोग करके ज़िप और अनजिप फ़ाइलें (http://www.naterice.com/blog/template_permalink.asp?id=64)"। मैंने इनका परीक्षण नहीं किया है, लेकिन यह संभव है कि वे केवल 'ज़िप' को संपीड़ित न करें। – samjudson

+1

ज़िप और संपीड़न के बीच आप क्या भेद कर रहे हैं? – Cheeso

+1

आप उन्हें बिना किसी संपीड़न के फ़ाइलों को 'ज़िप' कर सकते हैं, जैसे यूनिक्स में 'tar'। यह आपको फ़ाइलों को पैकेज के रूप में वितरित करने की अनुमति देता है, लेकिन डिस्क स्थान के आकार को कम नहीं करता है। – samjudson

उत्तर

28

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

मूलभूत सिद्धांत यह है कि विंडोज़ के भीतर आप एक ज़िप फ़ाइल को निर्देशिका के रूप में देख सकते हैं, और इसकी प्रतिलिपि बना सकते हैं। तो एक नई ज़िप फ़ाइल बनाने के लिए, आप बस .zip एक्सटेंशन के साथ एक फ़ाइल बनाते हैं जिसमें खाली ज़िप फ़ाइल के लिए सही शीर्षलेख है। फिर आप इसे बंद करते हैं, और उन विंडो को बताते हैं जिन्हें आप फाइलों में कॉपी करना चाहते हैं जैसे कि यह एक और निर्देशिका थी।

अनजिपिंग आसान है - बस इसे एक निर्देशिका के रूप में देखें।

मामले में वेब पृष्ठों फिर से खो रहे हैं, यहाँ प्रासंगिक कोड के टुकड़े के कुछ कर रहे हैं:

ज़िप

Sub NewZip(sPath) 
'Create empty Zip File 
'Changed by keepITcool Dec-12-2005 
    If Len(Dir(sPath)) > 0 Then Kill sPath 
    Open sPath For Output As #1 
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) 
    Close #1 
End Sub 


Function bIsBookOpen(ByRef szBookName As String) As Boolean 
' Rob Bovey 
    On Error Resume Next 
    bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing) 
End Function 


Function Split97(sStr As Variant, sdelim As String) As Variant 
'Tom Ogilvy 
    Split97 = Evaluate("{""" & _ 
         Application.Substitute(sStr, sdelim, """,""") & """}") 
End Function 

Sub Zip_File_Or_Files() 
    Dim strDate As String, DefPath As String, sFName As String 
    Dim oApp As Object, iCtr As Long, I As Integer 
    Dim FName, vArr, FileNameZip 

    DefPath = Application.DefaultFilePath 
    If Right(DefPath, 1) <> "\" Then 
     DefPath = DefPath & "\" 
    End If 

    strDate = Format(Now, " dd-mmm-yy h-mm-ss") 
    FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip" 

    'Browse to the file(s), use the Ctrl key to select more files 
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _ 
        MultiSelect:=True, Title:="Select the files you want to zip") 
    If IsArray(FName) = False Then 
     'do nothing 
    Else 
     'Create empty Zip File 
     NewZip (FileNameZip) 
     Set oApp = CreateObject("Shell.Application") 
     I = 0 
     For iCtr = LBound(FName) To UBound(FName) 
      vArr = Split97(FName(iCtr), "\") 
      sFName = vArr(UBound(vArr)) 
      If bIsBookOpen(sFName) Then 
       MsgBox "You can't zip a file that is open!" & vbLf & _ 
         "Please close it and try again: " & FName(iCtr) 
      Else 
       'Copy the file to the compressed folder 
       I = I + 1 
       oApp.Namespace(FileNameZip).CopyHere FName(iCtr) 

       'Keep script waiting until Compressing is done 
       On Error Resume Next 
       Do Until oApp.Namespace(FileNameZip).items.Count = I 
        Application.Wait (Now + TimeValue("0:00:01")) 
       Loop 
       On Error GoTo 0 
      End If 
     Next iCtr 

     MsgBox "You find the zipfile here: " & FileNameZip 
    End If 
End Sub 

अनज़िप

Sub Unzip1() 
    Dim FSO As Object 
    Dim oApp As Object 
    Dim Fname As Variant 
    Dim FileNameFolder As Variant 
    Dim DefPath As String 
    Dim strDate As String 

    Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _ 
             MultiSelect:=False) 
    If Fname = False Then 
     'Do nothing 
    Else 
     'Root folder for the new folder. 
     'You can also use DefPath = "C:\Users\Ron\test\" 
     DefPath = Application.DefaultFilePath 
     If Right(DefPath, 1) <> "\" Then 
      DefPath = DefPath & "\" 
     End If 

     'Create the folder name 
     strDate = Format(Now, " dd-mm-yy h-mm-ss") 
     FileNameFolder = DefPath & "MyUnzipFolder " & strDate & "\" 

     'Make the normal folder in DefPath 
     MkDir FileNameFolder 

     'Extract the files into the newly created folder 
     Set oApp = CreateObject("Shell.Application") 

     oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items 

     'If you want to extract only one file you can use this: 
     'oApp.Namespace(FileNameFolder).CopyHere _ 
     'oApp.Namespace(Fname).items.Item("test.txt") 

     MsgBox "You find the files here: " & FileNameFolder 

     On Error Resume Next 
     Set FSO = CreateObject("scripting.filesystemobject") 
     FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True 
    End If 
End Sub 
+7

चेतावनी: पोस्ट की गई स्क्रिप्ट विंडोज़ शैल के कार्यान्वयन-निर्भर व्यवहार पर भरोसा करती हैं और उदाहरण के लिए, जब तृतीय पक्ष संपीड़न सॉफ़्टवेयर ज़िप अभिलेखागार के लिए डिफ़ॉल्ट ओएलई क्रियाओं को बदलता है तो आसानी से तोड़ सकता है। साथ ही, zipfldr.dll COM ऑब्जेक्ट्स * नहीं * दस्तावेज या एमएस द्वारा इस उपयोग के लिए समर्थित हैं। –

+0

गलत फ़ाइलें, ज़िप फ़ाइलों पर ओएलई क्रियाएं उपर्युक्त स्क्रिप्ट के साथ हस्तक्षेप नहीं करती हैं। समर्थन नहीं कर रहा है (या दस्तावेज) यह स्वचालित रूप से मतलब नहीं है कि एमएस इसे तोड़ने जा रहे हैं। वे हो सकते हैं, लेकिन फिर वे इसे भी दस्तावेज कर सकते हैं। – wqw

+0

लिंक मृत हैं – beerwin

1

SourceForge (http://sourceforge.net/projects/unxutils) पर उपलब्ध UnxUtils पैकेज में ज़िप और अनजिप निष्पादन योग्य (साथ ही साथ अन्य उपयोगी अनुप्रयोगों का नाव भार) दोनों ज़िप हैं। उन्हें अपने पथ में किसी स्थान पर कॉपी करें, जैसे 'c: \ windows', और आप उन्हें अपनी स्क्रिप्ट में शामिल करने में सक्षम होंगे।

यह सही समाधान नहीं है (या जिसे आपने पूछा है) लेकिन एक सभ्य काम-एक-दौर है।

+2

UnxUtils प्रोजेक्ट अब और बनाए रखा प्रतीत नहीं होता है (2007 के बाद से कुछ नया नहीं)। [GNUWin32 प्रोजेक्ट] (http://gnuwin32.sourceforge.net/) में विंडोज़ पर जीएनयू टूल्स की हालिया रिलीज हैं। इसमें [InfoZip] (http://www.info-zip.org/) के ज़िप/अनजिप के निर्माण शामिल हैं। लेकिन यह सीधे InfoZip निर्माण [अपने स्रोत से] (http://sourceforge.net/projects/infozip/files/) के लिए बेहतर और सुरक्षित है। – dolmen

24

हाँ, इस के साथ पटकथा किया जा सकता है VBScript। उदाहरण के लिए निम्नलिखित कोड एक निर्देशिका से एक ज़िप बना सकते हैं:

Dim fso, winShell, MyTarget, MySource, file 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set winShell = createObject("shell.application") 


MyTarget = Wscript.Arguments.Item(0) 
MySource = Wscript.Arguments.Item(1) 

Wscript.Echo "Adding " & MySource & " to " & MyTarget 

'create a new clean zip archive 
Set file = fso.CreateTextFile(MyTarget, True) 
file.write("PK" & chr(5) & chr(6) & string(18,chr(0))) 
file.close 

winShell.NameSpace(MyTarget).CopyHere winShell.NameSpace(MySource).Items 

do until winShell.namespace(MyTarget).items.count = winShell.namespace(MySource).items.count 
    wscript.sleep 1000 
loop 

Set winShell = Nothing 
Set fso = Nothing 

तुम भी http://www.naterice.com/blog/template_permalink.asp?id=64 लिए उपयोगी हो सकते हैं क्योंकि यह एक पूर्ण खोल दो/VBScript में पिन कार्यान्वयन भी शामिल है।

यदि आप एक आकार की गणना के बजाय प्रत्येक 500 एमएस की जांच करते हैं तो यह बड़ी फ़ाइलों के लिए बेहतर काम करता है।

set fso=createobject("scripting.filesystemobject") 
Set h=fso.getFile(DestZip) 
do 
    wscript.sleep 500 
    max = h.size 
loop while h.size > max 

लॉग फ़ाइलों की भारी मात्रा के लिए महान काम करता है: हालांकि यह संपीड़ित समाप्त नहीं हुआ है 7 विन तुरन्त फ़ाइल लिखता है।

+0

क्या यह Vista पर काम करता है? मुझे कुछ मुद्दों का सामना करना पड़ रहा है और यह दावा करने के लिए तैयार है कि विस्टा अपराधी है। – Icode4food

5

बस स्पष्टता के लिए: जीज़िप अगस्त से उनकी टिप्पणी में गाय स्टारबक द्वारा सुझाए गए एमएस-एल्गोरिदम नहीं है। System.IO.Compression में GZipStream Deflate एल्गोरिदम का उपयोग करता है, बस zlib लाइब्रेरी के समान, और कई अन्य ज़िप उपकरण। वह वर्ग यूनिक्स उपयोगिताओं जैसे gzip के साथ पूरी तरह से अंतःक्रियाशील है।

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

मुफ्त DotNetZip लाइब्रेरी ज़िप फ़ाइलों को पढ़ और उत्पादन करती है, और वीबीस्क्रिप्ट या पावरहेल से लिखी जा सकती है। इसमें ज़िप फ़ाइलों को बनाने और पढ़ने/निकालने के लिए कमांड लाइन टूल्स भी शामिल हैं।

dim filename 
filename = "C:\temp\ZipFile-created-from-VBScript.zip" 

WScript.echo("Instantiating a ZipFile object...") 
dim zip 
set zip = CreateObject("Ionic.Zip.ZipFile") 

WScript.echo("using AES256 encryption...") 
zip.Encryption = 3 

WScript.echo("setting the password...") 
zip.Password = "Very.Secret.Password!" 

WScript.echo("adding a selection of files...") 
zip.AddSelectedFiles("*.js") 
zip.AddSelectedFiles("*.vbs") 

WScript.echo("setting the save name...") 
zip.Name = filename 

WScript.echo("Saving...") 
zip.Save() 

WScript.echo("Disposing...") 
zip.Dispose() 

WScript.echo("Done.") 

यहाँ Powershell के लिए कुछ कोड है::

यहाँ VBScript के लिए कुछ कोड है

[System.Reflection.Assembly]::LoadFrom("c:\\dinoch\\bin\\Ionic.Zip.dll"); 

$directoryToZip = "c:\\temp"; 
$zipfile = new-object Ionic.Zip.ZipFile; 
$e= $zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.") 
$e= $zipfile.AddDirectory($directoryToZip, "home") 
$zipfile.Save("ZipFiles.ps1.out.zip"); 

एक .bat या .cmd फ़ाइल में, आप zipit.exe या unzip.exe उपयोग कर सकते हैं उपकरण। उदाहरण के लिए:

zipit NewZip.zip -s "This is string content for an entry" Readme.txt src 
1

एक संपीड़ित संग्रह बनाने के लिए आप उपयोगिता MakeCab.exe

+0

काफी ज़िप फाइल नहीं है, लेकिन फिर भी, यह आसान हो सकता है, धन्यवाद! – travis

+1

-1 - सीएबी ज़िप नहीं हैं – user66001

2

Here'a संक्षेप में प्रस्तुत करने संपीड़न और असंपीड़न के लिए निर्मित क्षमताओं खिड़कियों मेरे प्रयास का उपयोग कर सकते हैं - How can I compress (/ zip) and uncompress (/ unzip) files and folders with batch file without using any external tools?

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

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