25

I have bunch of files in a directory. I tried following makecab but it does not include all the files in a folder into the cab file.

makecab /d "C:\Users\crtorres\Documents\- SouthPacific Project 2014\- Projects\Sales Doc Center\New Region" test.cab

The following works but the cab file only has the manifest file. makecab manifest.xml test.cab

npocmaka
  • 55,367
  • 18
  • 148
  • 187
torres
  • 1,283
  • 8
  • 21
  • 30

2 Answers2

34

I've finally created a script that can actually do this properly (with powershell)

It doesn't use WSPBuilder as I'm often contracted out and it's inconvenient to download new software/extra files. This works OOTB.

function compress-directory([string]$dir, [string]$output)
{
    $ddf = ".OPTION EXPLICIT
.Set CabinetNameTemplate=$output
.Set DiskDirectory1=.
.Set CompressionType=MSZIP
.Set Cabinet=on
.Set Compress=on
.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
"
    $dirfullname = (get-item $dir).fullname
    $ddfpath = ($env:TEMP+"\temp.ddf")
    $ddf += (ls -recurse $dir | where { !$_.PSIsContainer } | select -ExpandProperty FullName | foreach { '"' + $_ + '" "' + ($_ | Split-Path -Leaf) + '"' }) -join "`r`n"
    $ddf
    $ddf | Out-File -Encoding UTF8 $ddfpath
    makecab.exe /F $ddfpath
    rm $ddfpath
    rm setup.inf
    rm setup.rpt
}

please let me know if i'm doing something wrong and/or could be better.

for reference:

http://www.pseale.com/blog/StrongOpinionSayNoToMAKECABEXE.aspx

NOTE: Change made by Jerry Cote, see edit notes

Vizor
  • 396
  • 3
  • 14
Nacht
  • 3,342
  • 4
  • 26
  • 41
  • 14
    This is beautiful, but, usage: Open PowerShell; Paste this function into PowerShell; Hit Enter; compress-directory .\some-dir-to-compress .\filename.cab – turiyag Feb 17 '15 at 03:14
  • 1
    Just some usage issues to be aware of if anyone runs across this older post. Destination will not take a literal path. You can push / pop a location as a workaround. command would look something like "compress-directory c:\temp .\temp.cab"
    Additionally cab files have issues when going above 2 gigabytes - 512bytes. As an additional option, Compression type LZX can be set as an alternative.
    –  Jul 20 '16 at 17:50
  • Does this script compresses the directory itself or everything under the directory? In other words, does it compress `dir/` or `dir/*`? – Chromium May 28 '18 at 02:15
  • @Chromium try it and see. It appears to do `dir/*`. Also why has no one told me that i have a bug which removes the first character of every filename! fixed now. – Nacht May 28 '18 at 02:25
  • 1
    @turiyag Also, you seem to need to press `Enter` twice after pasting the function – Chromium May 28 '18 at 02:49
  • i think the script adds a prefix '/' to the files' name.. is it only whos getting it? – Lakshay Dulani Jul 17 '18 at 12:53
  • This didn't work for me if files in different folders have the same name, so I ended up changing it to `'"' + $_ + '" "' + $_.Substring($dir.Length + 1) + '"' }` instead. (So path is contained in name) – Thomas Glaser Mar 02 '22 at 08:08
  • If you get `(FCIFlushCabinet)Failure creating or writing cabinet file: `, this is because the target is in the wrong syntax (drive:\folder\file.cab) instead of the correct syntax (.\file.cab). – Unknow0059 Sep 27 '22 at 23:40
20

/d switch cannot be used for files:

@echo off
dir /s /b /a-d >files.txt
makecab /d "CabinetName1=test.cab" /f files.txt
del /q /f files.txt

More info

EDIT here can be found a script that preserves the whole directory structure

Community
  • 1
  • 1
npocmaka
  • 55,367
  • 18
  • 148
  • 187
  • 1
    In some cases file path and name of "files.txt" is added to "files.txt" as well. Then files.txt will be in the test.cab, too. – Hinek Jun 06 '16 at 14:32
  • /d "MaxDiskSize=0" can be added to makecab if you only want to create a single .cab file – G2_Robot Jan 19 '23 at 16:57