Scripts/SolutionExport.ps1

# SolutionExport.ps1

function Invoke-ExportSolution {
  Param(
    [string] [Parameter(Mandatory = $true)] $StartPath,
    [string] [Parameter(Mandatory = $true)] $SelectedSolution,
    [string] [Parameter(Mandatory = $false)] $UserName = "",
    [string] [Parameter(Mandatory = $false)] $Password = "",
    [string] [Parameter(Mandatory = $false)] $TenantId = "",
    [bool] [Parameter(Mandatory = $false)] $UseClientSecret = $false
  )

  try {
    if (!$global:devops_FullTool) {
      $global:devops_projectLocation = $StartPath
      Install-ConfigMigrationModule
      Install-PowerAppsAdmin
      Install-XrmModule

      If ($UserName -ne "") {
        $global:devops_DataverseEmail = $UserName
      }
      If ($Password -ne "") {
        $global:Password = $Password
      }
      If ($TenantId -ne "") {
        $global:devops_TenantID = $TenantId
      }
      If ($UseClientSecret -eq $true) {
        $global:devops_DataverseCredType = "servicePrincipal"
        $global:devops_ClientID = $UserName
        $global:clientSecret = $Password
  
      }
      If ($UseClientSecret -eq $false) {
        $global:devops_DataverseCredType = "user"
      }
  
    }

    $ProgressPreference = 'SilentlyContinue'

    $message = @"
 
 ____ _ _ _ _____ _
/ ___| ___ | |_ _| |_(_) ___ _ __ | ____|_ ___ __ ___ _ __| |_
\___ \ / _ \| | | | | __| |/ _ \| '_ \ | _| \ \/ / '_ \ / _ \| '__| __|
 ___) | (_) | | |_| | |_| | (_) | | | | | |___ > <| |_) | (_) | | | |_
|____/ \___/|_|\__,_|\__|_|\___/|_| |_| |_____/_/\_\ .__/ \___/|_| \__|
                                                   |_|
 
v2
"@

    Write-Host $message
    Write-Host ""    

    Write-Host "Running for path : " $StartPath
    Get-ConfigJSON($StartPath)

    $message = "Installing Solution Management Tools..."
    Write-Host $message

    Install-PAC

    $message = "Establishing connection to $global:devops_ServerUrl"
    Write-Host $message

    $conn = Get-DataverseConnection($global:devops_ServerUrl)
        
    #Create PAC Auth
    if ($global:devops_DataverseCredType -eq "servicePrincipal") {
      & $env:APPDATA\Microsoft.PowerPlatform.DevOps\PACTools\tools\pac.exe auth delete --name ppdo
      # Added escaped quotes required to get secrets working that started with - (https://github.com/dylanhaskins/Microsoft.PowerPlatform.DevOps/issues/150)
      & $env:APPDATA\Microsoft.PowerPlatform.DevOps\PACTools\tools\pac.exe auth create --applicationId $global:devops_ClientID --clientSecret `"$global:clientSecret`" --environment $global:devops_ServerUrl  --tenant $global:devops_TenantID  --name ppdo
      #--name $global:devops_SolutionName
    }
    if ($global:devops_DataverseCredType -eq "user") {
      & $env:APPDATA\Microsoft.PowerPlatform.DevOps\PACTools\tools\pac.exe auth delete --name ppdo
      & $env:APPDATA\Microsoft.PowerPlatform.DevOps\PACTools\tools\pac.exe auth create --username $global:devops_DataverseEmail --password $global:Password --environment $global:devops_ServerUrl --name ppdo
      #--name $global:devops_SolutionName
    }

    if ($conn.IsReady) {

      ######################## CHECK SOLUTION
      # Get solution by name
      $SolutionQuery = Get-CrmRecords -conn $conn -EntityLogicalName solution -Fields 'friendlyname', 'version', 'uniquename' -FilterAttribute uniquename -FilterOperator eq -FilterValue $global:devops_SolutionName
      $Solution = $SolutionQuery.CrmRecords[0]
      if (!$Solution) { throw "Solution not found: $global:devops_SolutionName" }
      $SolutionId = $Solution.solutionid
      $SolutionVersion = $Solution.version
      $SolutionName = $Solution.uniquename
      Write-Host "Found:" $SolutionId "-" $Solution.friendlyname  "-" $SolutionVersion

      # Get most recent patch solution
      Write-Host "Checking for Patch Solutions ..."
      $PatchQuery = Get-CrmRecordsByFetch -conn $conn @"
<fetch>
  <entity name="solution" >
    <attribute name="uniquename" />
    <attribute name="friendlyname" />
    <attribute name="version" />
    <filter>
      <condition attribute="parentsolutionid" operator="eq" value="$SolutionId" />
    </filter>
    <order attribute="createdon" descending="false" />
  </entity>
</fetch>
"@
 


      Get-DataverseSolution "$StartPath\$SelectedSolution" $SelectedSolution

    }
  }
  catch {
    Write-Host $_
    pause
  }
  finally {
    ######################### CLEANING UP #########################
    $message = "Cleaning Up..."
    Write-Host $message
    
    Remove-Item (Join-Path $StartPath "nuget.exe") -ErrorAction Ignore -Force
    Remove-Item (Join-Path $StartPath "Tools") -Force -Recurse -ErrorAction Ignore
    Remove-Item (Join-Path $StartPath "*.zip") -Force -ErrorAction Ignore -Exclude "Publisher.zip"
    & $env:APPDATA\Microsoft.PowerPlatform.DevOps\PACTools\tools\pac.exe auth delete --name ppdo        
    $message = "Complete ... Enjoy !!!"
    Write-Host $message
    If (!$UserName) {
      pause
    }
        
  }
}