Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I would to have PowerShell zip the contents of a bunch of folders and get an individual ZIP file for each folder. Recently, I asked how to do this with a .bat file and an answer was provided.

for /D %%d in (*.*) do "C:\Program Files\7-Zip\7z\7za.exe" a -tzip %%d.zip %%d

However, this proved useful only for folders that have no spaces in their name. The reason being that batch will do the following: if the folder name is "Jeff's vacation pictures", the variables will be:

%%d = Jeff's<br>
%%e = vacation<br>
%%f = pictures<br>

And then it tries to pass only %%d to the 7-Zip program, which will not find such a folder and therefore will not create a ZIP file.

I've tried looking up some tutorials, documentation sites and such, but I haven't been able to come up with an answer. There may be an answer, but I want to take this opportunity to try my hand at PowerShell.

I was thinking that a function with one argument, that being the parent-folder of the sub-folders that need to be zipped, would be the best approach.

So here's what I have, which doesn't work, probably due to my general inexperience with PowerShell:

function zipFolders($parent) {
    $zip = "C:\Program Files\7-Zip\7z\7za.exe";
    $parents | ForEach-Object $zip a -tzip
}
share
    
I don't now about powershell, but for the batch file try rapping the use of %%d in quotes ("%%d", "%%d.zip"). Good luck with Powershell, I need to learn it too. –  Scott McClenning Jan 30 '10 at 18:37
    
Yeah, the person who wrote it updated the old answer with that. –  KdgDev Jan 31 '10 at 0:50

1 Answer 1

You need to give 7-Zip an output file name and the name of the input directory for it to work. You also want to call Get-ChildItem (dir) on your parent path to get its subpaths.

The following snippet should put each subfolder of $rootFolder into a max compression ZIP file named after the subfolder in the current path.

dir $rootFolder | Where-Object { $_.PSIsContainer } | ForEach-Object { C:\"Program Files"\7-zip\7z.exe a -mx9 "$_.zip" $_.FullName }
share
    
Is this code correct? There is no feedback as to the value of this answer. –  Russell Nov 4 '10 at 2:36
    
@Russell: The PowerShell code itself looks right to me. However, I don't know the command line arguments to 7Zip, so you might have to tweak the part between the curly braces for your particular case. –  Robert S Ciaccio Dec 7 '10 at 19:31
    
Tried this script while trying to write a PS script to run git pull in a set of folders. The recursion works but the 7z command does not (Error:incorrect command line), at least not in the version I have (PowerShell 2, 7z version 7). –  calenti Jun 8 '12 at 8:25

This site is currently not accepting new answers.

Not the answer you're looking for? Browse other questions tagged .