src/Solutions/Invoke-XrmSolutionPackager.ps1

<#
    .SYNOPSIS
    Run solution packager tool.

    .DESCRIPTION
    Pack or unpack given solution file with Solution Packager.

    .PARAMETER SolutionFilePath
    Full path to solution file (.zip).

    .PARAMETER SolutionPackagerExeFilePath
    Full path to solution packager executable. (Default : $PSScriptRoot\bin\SolutionPackager.exe)

    .PARAMETER Action
    The action to perform.
    The action can be either to extract a solution .zip file to a folder, or to pack a folder into a .zip file.

    .PARAMETER PackageType
    The type of package to process. (Default: Both)
    This argument may be omitted in most occasions because the package type can be read from inside the .zip file or component files.
    When extracting and Both is specified, managed and unmanaged solution .zip files must be present and are processed into a single folder.
    When packing and Both is specified, managed and unmanaged solution .zip files will be produced from one folder.

    .PARAMETER FolderPath
    Full path to a folder where solution will be extracted or packed.
    When extracting, this folder is created and populated with component files.
    When packing, this folder must already exist and contain previously extracted component files.

    .PARAMETER ErrorLevel
    Indicates the level of logging information to output. (Default: Error)

    .PARAMETER LogFilePath
    Full path to log file. If the file already exists, new logging information is appended to the file.
#>

function Invoke-XrmSolutionPackager {
    [CmdletBinding()]
    param
    (        
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]
        $SolutionFilePath,

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [ValidateScript( { Test-Path $_ })]
        [String]
        $SolutionPackagerExeFilePath = "$PSScriptRoot\..\Assemblies\SolutionPackager.exe",

        [Parameter(Mandatory = $true)]
        [ValidateSet("Extract", "Pack")]
        [String]
        $Action,

        [Parameter(Mandatory = $false)]
        [ValidateSet("Unmanaged", "Managed", "Both")]
        [String]
        $PackageType = "Both",

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [String]
        $FolderPath,

        [Parameter(Mandatory = $false)]
        [ValidateSet("Off", "Error", "Warning", "Info", "Both", "Verbose")]
        [String]
        $ErrorLevel = "Error",

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [String]
        $LogFilePath = "$($env:TEMP)\SolutionPackager.log"

    )
    begin {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters); 
    }    
    process {
        
        $solutionPackagerOuput = "";
        if ($Action -eq "Extract") {
            $solutionPackagerOuput = & "$SolutionPackagerExeFilePath" /action:$Action /zipfile:"$SolutionFilePath" /folder:"$FolderPath" /clobber /allowWrite:Yes /allowDelete:Yes /errorlevel:$ErrorLevel /nologo;
        }
        elseif ($Action -eq "Pack") {
            $solutionPackagerOuput = & "$SolutionPackagerExeFilePath" /action:$Action /zipfile:"$SolutionFilePath" /folder:"$FolderPath" /packagetype:$PackageType /errorlevel:$ErrorLevel /log:$LogFilePath /nologo;
        }
        $solutionPackagerOuput;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function Invoke-XrmSolutionPackager -Alias *;