Compressed (zipped) Folder - command line variant?

G

Guest

Is there any way to create a zipped folder from the command line? "Compact"
doesn't really do what I want (just uses drivespace or something to compress
the folder).

What I'm trying to do is make a simple batch file that creates a folder,
throws a bunch of files with the same extenstion into it, and then zips it
up- but without a command line version of the built-in windows zip program
this will be impossible (through batch file anyway). Any ideas?
 
D

David Candy

This script extracts files from a zip passed on the command line and makes a folder on the desktop with the contents. Just do reverse to zip. A new zip file is easly created (look at a new one - it's 14 bytes of mostly null but starting PK). This uses Shell commands rather than File commands. We are working with shell objects that merely happen to be files.

Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")


Set DestFldr=objShell.NameSpace(Ag(1))
Set SrcFldr=objShell.NameSpace(Ag(0))
Set FldrItems=SrcFldr.Items
DestFldr.CopyHere FldrItems, &H214


I specified options of 0x214 (&h214) in hex. 200 + 10 + 4, change to suit your purposes.

Private Const FO_MOVE As Long = &H1
Private Const FO_COPY As Long = &H2
Private Const FO_DELETE As Long = &H3
Private Const FO_RENAME As Long = &H4

Private Const FOF_MULTIDESTFILES As Long = &H1
Private Const FOF_CONFIRMMOUSE As Long = &H2
Private Const FOF_SILENT As Long = &H4
Private Const FOF_RENAMEONCOLLISION As Long = &H8
Private Const FOF_NOCONFIRMATION As Long = &H10
Private Const FOF_WANTMAPPINGHANDLE As Long = &H20
Private Const FOF_CREATEPROGRESSDLG As Long = &H0
Private Const FOF_ALLOWUNDO As Long = &H40
Private Const FOF_FILESONLY As Long = &H80
Private Const FOF_SIMPLEPROGRESS As Long = &H100
Private Const FOF_NOCONFIRMMKDIR As Long = &H200

FlagDescription
FOF_ALLOWUNDO Preserve Undo information, if possible. If pFrom does not contain fully qualified path and file names, this flag is ignored.
FOF_CONFIRMMOUSENot currently used.
FOF_FILESONLY Perform the operation on files only if a wildcard file name (*.*) is specified.
FOF_MULTIDESTFILES The pTo member specifies multiple destination files (one for each source file) rather than one directory where all source files are to be deposited.
FOF_NOCONFIRMATION Respond with "Yes to All" for any dialog box that is displayed.
FOF_NOCONFIRMMKDIR Do not confirm the creation of a new directory if the operation requires one to be created.
FOF_NO_CONNECTED_ELEMENTSVersion 5.0. Do not move connected files as a group. Only move the specified files.
FOF_NOCOPYSECURITYATTRIBSVersion 4.71. Do not copy the security attributes of the file.
FOF_NOERRORUI Do not display a user interface if an error occurs.
FOF_NORECURSIONOnly operate in the local directory. Don't operate recursively into subdirectories.
FOF_RECURSEREPARSERecurse into reparse points. The default is to not recurse.
FOF_NORECURSEREPARSETreat reparse points as objects, not containers. You must set _WIN32_WINNT to 5.01 or later to use this flag. See Shell and Common Controls Versions for further discussion of versioning.
FOF_RENAMEONCOLLISION Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
FOF_SILENT Do not display a progress dialog box.
FOF_SIMPLEPROGRESS Display a progress dialog box but do not show the file names.
FOF_WANTMAPPINGHANDLE If FOF_RENAMEONCOLLISION is specified and any files were renamed, assign a name mapping object containing their old and new names to the hNameMappings member.
FOF_WANTNUKEWARNINGVersion 5.0. Send a warning if a file is being destroyed during a delete operation rather than recycled. This flag partially overrides FOF_NOCONFIRMATION.
 
G

Guest

Awesome! Thanks. I'll give that a try.

David Candy said:
This script extracts files from a zip passed on the command line and makes a folder on the desktop with the contents. Just do reverse to zip. A new zip file is easly created (look at a new one - it's 14 bytes of mostly null but starting PK). This uses Shell commands rather than File commands. We are working with shell objects that merely happen to be files.

Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")


Set DestFldr=objShell.NameSpace(Ag(1))
Set SrcFldr=objShell.NameSpace(Ag(0))
Set FldrItems=SrcFldr.Items
DestFldr.CopyHere FldrItems, &H214


I specified options of 0x214 (&h214) in hex. 200 + 10 + 4, change to suit your purposes.

Private Const FO_MOVE As Long = &H1
Private Const FO_COPY As Long = &H2
Private Const FO_DELETE As Long = &H3
Private Const FO_RENAME As Long = &H4

Private Const FOF_MULTIDESTFILES As Long = &H1
Private Const FOF_CONFIRMMOUSE As Long = &H2
Private Const FOF_SILENT As Long = &H4
Private Const FOF_RENAMEONCOLLISION As Long = &H8
Private Const FOF_NOCONFIRMATION As Long = &H10
Private Const FOF_WANTMAPPINGHANDLE As Long = &H20
Private Const FOF_CREATEPROGRESSDLG As Long = &H0
Private Const FOF_ALLOWUNDO As Long = &H40
Private Const FOF_FILESONLY As Long = &H80
Private Const FOF_SIMPLEPROGRESS As Long = &H100
Private Const FOF_NOCONFIRMMKDIR As Long = &H200

FlagDescription
FOF_ALLOWUNDO Preserve Undo information, if possible. If pFrom does not contain fully qualified path and file names, this flag is ignored.
FOF_CONFIRMMOUSENot currently used.
FOF_FILESONLY Perform the operation on files only if a wildcard file name (*.*) is specified.
FOF_MULTIDESTFILES The pTo member specifies multiple destination files (one for each source file) rather than one directory where all source files are to be deposited.
FOF_NOCONFIRMATION Respond with "Yes to All" for any dialog box that is displayed.
FOF_NOCONFIRMMKDIR Do not confirm the creation of a new directory if the operation requires one to be created.
FOF_NO_CONNECTED_ELEMENTSVersion 5.0. Do not move connected files as a group. Only move the specified files.
FOF_NOCOPYSECURITYATTRIBSVersion 4.71. Do not copy the security attributes of the file.
FOF_NOERRORUI Do not display a user interface if an error occurs.
FOF_NORECURSIONOnly operate in the local directory. Don't operate recursively into subdirectories.
FOF_RECURSEREPARSERecurse into reparse points. The default is to not recurse.
FOF_NORECURSEREPARSETreat reparse points as objects, not containers. You must set _WIN32_WINNT to 5.01 or later to use this flag. See Shell and Common Controls Versions for further discussion of versioning.
FOF_RENAMEONCOLLISION Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
FOF_SILENT Do not display a progress dialog box.
FOF_SIMPLEPROGRESS Display a progress dialog box but do not show the file names.
FOF_WANTMAPPINGHANDLE If FOF_RENAMEONCOLLISION is specified and any files were renamed, assign a name mapping object containing their old and new names to the hNameMappings member.
FOF_WANTNUKEWARNINGVersion 5.0. Send a warning if a file is being destroyed during a delete operation rather than recycled. This flag partially overrides FOF_NOCONFIRMATION.
 
G

Guest

Yeah, the problem is that I didn't want to force the user to install/copy
pkzip onto their computer.
 
G

Guest

David,

I tried that script and ran into a few problems. I wanted to first try it in
its original format, so I copied and pasted the top portion. I have some
programming experience but skipped the whole shell scripting phase, so I just
assumed that you needed the private constants and the top part of the
program, minus the parts that are obviously not code.

The command line didn't like the constants, so I figured those might be
built in, and then it accepted most of the script except for the last part-
"DestFldr.CopyHere FldrItems, &H214" gave me the error:

& H214 ' DestFldr.CopyHere' is not recognized as an internal or external
command, operable program or batch file. 'H214' is not recognized as an
internal or external command, operable program or batch file.

Any ideas?

Thanks,
Mike
 
D

David Candy

You cut and pasted it wrong.

I've been playing with it and when zipping it often doesn't do anything. Poping up a dialog box makes it work. It could be a timing issue. But putting a msgbox at the end of the code always zips.

unzip <folder or zip name to be copied from> <folder or zip name to copy to>
unZip.vbs" "C:\Documents and Settings\David Candy\Desktop\test" "C:\Documents and
Settings\David Candy\Desktop\AFDG_W.zip"


Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")

Set DestFldr=objShell.NameSpace(Ag(1))
Set SrcFldr=objShell.NameSpace(Ag(0))
Set FldrItems=SrcFldr.Items
DestFldr.CopyHere FldrItems, &H214
Msgbox "Finished"
 
T

Torgeir Bakken \(MVP\)

Tempest261 said:
David,

I tried that script and ran into a few problems. I wanted to first try it in
its original format, so I copied and pasted the top portion. I have some
programming experience but skipped the whole shell scripting phase, so I just
assumed that you needed the private constants and the top part of the
program, minus the parts that are obviously not code.

The command line didn't like the constants, so I figured those might be
built in, and then it accepted most of the script except for the last part-
"DestFldr.CopyHere FldrItems, &H214" gave me the error:

& H214 ' DestFldr.CopyHere' is not recognized as an internal or external
command, operable program or batch file. 'H214' is not recognized as an
internal or external command, operable program or batch file.

Any ideas?
Hi,

What David posted, was VBScript code, not a batch file. You need to
put the code into a .vbs file, that you can access from command line,
e.g. like this:

cscript.exe "c:\my scripts\zip.vbs" "some input parameter"
 
G

Guest

I can't get the script to work either.

Here is my session copied from a DOS Window:

---
D:\Vbs> type ZipTest.vbs
Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")

Set DestFldr=objShell.NameSpace(Ag(1))
Set SrcFldr=objShell.NameSpace(Ag(0))
Set FldrItems=SrcFldr.Items
DestFldr.CopyHere FldrItems, &H214
Msgbox "Finished"

D:\Vbs> dir c:\test
Volume in drive C has no label.
Volume Serial Number is A0FD-483A

Directory of c:\test

06/21/2005 17:06 <DIR> .
06/21/2005 17:06 <DIR> ..
06/21/2005 13:44 1,671,168 Track01 (2) .ISO
06/21/2005 13:43 1,671,168 Track01.ISO
06/21/2005 13:45 1,671,168 Track01.zip
3 File(s) 5,013,504 bytes
2 Dir(s) 125,554,696,192 bytes free

D:\Vbs> cscript ZipTest.vbs c:\test c:\test\test.zip
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

D:\Vbs\ZipTest.vbs(8, 1) Microsoft VBScript runtime error:
Object required: 'DestFldr'

D:\Vbs>
---

My intentions are to copy the files in c:\test to the zip file
c:\test\test.zip.

Any ideas?? TIA
 
D

David Candy

You have to create the folders/zips first. It's only sample code I did not do a full blown application as people want to incorporate the code within their own bigger scripts.

This creates a empty zip file. IE it writes to a file. Find your own empty zip and type in Start Run
edit /70 "c:\yourzip.zip"

Using binary view (the /70) means edit shows the character code in the status bar.

PK<a club (code 5)><a spade (code 6)> followed by 18 nulls (Code 0)

Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("c:\Test.zip", 8, vbtrue)
BlankZip = "PK" & Chr(5) & Chr(6)
For x = 0 to 17
BlankZip = BlankZip & Chr(0)
Next
ts.Write BlankZip
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top