New-CAB.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<#
.LINK
 https://www.osdeploy.com/
.SYNOPSIS
 Creates a CAB file from a Directory
.DESCRIPTION
 Creates a CAB file from a Directory
.PARAMETER SourceDirectory
 Directory to create the CAB from
.EXAMPLE
 New-CAB -SourceDirectory C:\DeploymentShare\OSDeploy\OSConfig
 Creates LZX High Compression CAB from of C:\DeploymentShare\OSDeploy\OSConfig
 Saves file in Parent Directory C:\DeploymentShare\OSDeploy\OSConfig.cab
.NOTES
 NAME:    New-CAB.ps1
 AUTHOR:    David Segura, david@segura.org
 BLOG:    http://www.osdeploy.com
 VERSION:    18.9.4
#>


function New-CAB
{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$SourceDirectory
    )
    BEGIN {}
    PROCESS {
        #======================================================================================
        Write-Verbose "Processing '$SourceDirectory' ..."
        #======================================================================================
        $ArchiveBaseName = (Get-Item $SourceDirectory).Name
        $ArchiveFileName = "$ArchiveBaseName.cab"
        $FolderFullName = (Get-Item $SourceDirectory).Fullname
        $DestinationFolder = (Get-Item $SourceDirectory).Parent.FullName
        $ArchiveFullName = Join-Path -Path $DestinationFolder -ChildPath $ArchiveFileName

        #======================================================================================
        Write-Verbose "Generating MakeCAB DDF ..."
        #======================================================================================
        $DirectiveString = [System.Text.StringBuilder]::new()
        [void]$DirectiveString.AppendLine(';*** MakeCAB Directive file;')
        [void]$DirectiveString.AppendLine('.OPTION EXPLICIT')
        [void]$DirectiveString.AppendLine(".Set CabinetNameTemplate=$ArchiveFileName")
        [void]$DirectiveString.AppendLine(".Set DiskDirectory1=$DestinationFolder")
        [void]$DirectiveString.AppendLine('.Set Cabinet=ON')
        [void]$DirectiveString.AppendLine('.Set Compress=ON')
        [void]$DirectiveString.AppendLine('.Set CompressionType=LZX')
        [void]$DirectiveString.AppendLine('.Set CabinetFileCountThreshold=0')
        [void]$DirectiveString.AppendLine('.Set FolderFileCountThreshold=0')
        [void]$DirectiveString.AppendLine('.Set FolderSizeThreshold=0')
        [void]$DirectiveString.AppendLine('.Set MaxCabinetSize=0')
        [void]$DirectiveString.AppendLine('.Set MaxDiskFileCount=0')
        [void]$DirectiveString.AppendLine('.Set MaxDiskSize=0')

        #======================================================================================
        Write-Verbose "Unblocking Files ..."
        #======================================================================================
        Get-ChildItem $FolderFullName -Recurse | Unblock-File
        
        #======================================================================================
        Write-Verbose "Adding DDF Content ..."
        #======================================================================================
        $DirectivePath = Join-Path -Path $DestinationFolder -ChildPath "$ArchiveBaseName.ddf"
        Get-ChildItem -Recurse $SourceDirectory | Where-Object { -Not($_.psiscontainer)} | Select-Object -ExpandProperty Fullname | Foreach-Object {
            [void]$DirectiveString.AppendLine("""$_"" ""$($_.SubString($FolderFullName.Length + 1))""")
        }
        
        #======================================================================================
        Write-Verbose "Compressing '$FolderFullName' to '$ArchiveFullName' ..."
        #======================================================================================
        $DirectiveString.ToString() | Out-File -FilePath $DirectivePath -Encoding UTF8
        makecab /F $DirectivePath
    }
    END {
        #======================================================================================
        Write-Verbose "Complete"
        #======================================================================================
    }
}