FrameworkTemplate/Solutions/Scripts/_ExportSolution.ps1

Param(
    [string] [Parameter(Mandatory = $true)] $StartPath
)
try {
    if (!$Credentials) {
        $message = "Getting Credentials for $global:devops_ServerUrl"
        Write-Host $message
      
        $Credentials = Get-Credential -Message "Credentials : $global:devops_SolutionName @ $global:devops_ServerUrl"
    }
    if (!$UserName) {
        $UserName = $Credentials.GetNetworkCredential().UserName
        $Password = $Credentials.GetNetworkCredential().Password
    }
      
    if (!$conn) {
        [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
        [string]$CrmConnectionString = "AuthType=OAuth;Username=$UserName;Password=$Password;Url=$global:devops_ServerUrl;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d;RedirectUri=app://58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Auto"
        $conn = Get-CrmConnection -ConnectionString $CrmConnectionString -Verbose -MaxCrmConnectionTimeOutMinutes 5
    }
    
    if ($conn.IsReady) {
    
        Remove-Item (Join-Path $StartPath "..\cdsunpack*patch*") -Force -Recurse -ErrorAction Ignore
    
        ######################## EXPORT SOLUTION
    
        ##Export Patches if they Exist
        foreach ($PatchSolution in $PatchQuery.CrmRecords) {
            $SolutionId = $PatchSolution.solutionid
            $SolutionName = $PatchSolution.uniquename
            $SolutionVersion = $PatchSolution.version
    
            $message = "Exporting Unmanaged Solution for $SolutionName"
            Write-Host $message
    
            Export-CrmSolution -SolutionName $SolutionName -SolutionZipFileName "$SolutionName.zip" -conn $conn -ErrorAction Stop
    
            $message = "Exporting Managed Solution for $SolutionName"
            Write-Host $message
    
            Export-CrmSolution -SolutionName $SolutionName -Managed -SolutionZipFileName $SolutionName"_managed.zip" -conn $conn -ErrorAction Stop
    
            $Path = (Join-Path $StartPath "..\Deployment")
            $ImportConfig = Get-ChildItem -Path $Path -Include "ImportConfig.xml" -Recurse
                                    
            [xml] $xdoc = (Get-Content -Path "$($ImportConfig.DirectoryName)\ImportConfig.xml")
    
            $node = $xdoc.SelectSingleNode("//configsolutionfile[contains(@solutionpackagefilename,'$($SolutionName)_managed.zip')]")               
            If (!$node) {
                $patch = $xdoc.configdatastorage.solutions.FirstChild.Clone()
                $patch.solutionpackagefilename = "$($SolutionName)_managed.zip"
                $patch.overwriteunmanagedcustomizations = "true"
                $xdoc.configdatastorage.solutions.AppendChild($patch)
                $xdoc.Save("$($ImportConfig.DirectoryName)\ImportConfig.xml")
            }
            ######################## EXTRACT SOLUTION
            # $ErrorActionPreference = "SilentlyContinue"
    
            $message = "Unpacking Solution $SolutionName"
            Write-Host $message
            Remove-Item (Join-Path $StartPath "..\cdsunpack$SolutionName\") -Recurse -Force -ErrorAction Ignore
            &.\Tools\SolutionPackager.exe /action:extract /folder:(Join-Path $StartPath "..\cdsunpack$SolutionName\") /zipfile:"$SolutionName.zip" /packagetype:Both /allowDelete:No /c /useUnmanagedFileForMissingManaged
        }
        
        ## No Patches
        If (!$PatchQuery.CrmRecords) {
            $message = "Exporting Unmanaged Solution for $SolutionName"
            Write-Host $message
    
            Export-CrmSolution -SolutionName $SolutionName -SolutionZipFileName "$SolutionName.zip" -conn $conn -ErrorAction Stop
    
            $message = "Exporting Managed Solution for $SolutionName"
            Write-Host $message
    
            Export-CrmSolution -SolutionName $SolutionName -Managed -SolutionZipFileName $SolutionName"_managed.zip" -conn $conn -ErrorAction Stop
    
            $Path = (Join-Path $StartPath "..\Deployment")
            $ImportConfig = Get-ChildItem -Path $Path -Include "ImportConfig.xml" -Recurse
                                    
            [xml] $xdoc = (Get-Content -Path "$($ImportConfig.DirectoryName)\ImportConfig.xml")
    
            $nodes = $xdoc.configdatastorage.solutions.SelectNodes("//configsolutionfile")         
            $nodes[0].solutionpackagefilename = "$($SolutionName)_managed.zip"
            $nodes[0].overwriteunmanagedcustomizations = "true"
            Write-Host Nodes $nodes.Count
            for ($i = 1; $i -le ($nodes.Count - 1); $i++) {
                $nodes[$i].ParentNode.RemoveChild($nodes[$i])
            }
                
            $xdoc.Save("$($ImportConfig.DirectoryName)\ImportConfig.xml")
            
            ######################## EXTRACT SOLUTION
            # $ErrorActionPreference = "SilentlyContinue"
    
    
            $message = "Unpacking Solution $SolutionName"
            Write-Host $message
            Remove-Item (Join-Path $StartPath "..\cdsunpack$SolutionName\") -Recurse -Force -ErrorAction Ignore
            &.\Tools\SolutionPackager.exe /action:extract /folder:(Join-Path $StartPath "..\cdsunpack$SolutionName\") /zipfile:"$SolutionName.zip" /packagetype:Both /allowDelete:No /c /useUnmanagedFileForMissingManaged
        }
    
    }    
}
catch {
    pause
}
finally{
    
}