A small function inspired by Fred Bainbridges post on howto append an OS requirement to a deployment type. The purpose of the function is to copy the Deploymenttype within an application, but if someone feels like a spending a few hours to rewrite it to copy between different applications that could possible work aswell.
function Copy-CMAppDT { <# .SYNOPSIS Copy a single Deployment Type within an application .DESCRIPTION This will create a copy of a DeploymentType, with the lowest priority and the name specified .EXAMPLE Copy-CMAppDT -appName "PingKing 2.0.0" -DeploymentType "PingKing 2.0.0" -newDTname "PingKing Updated" -siteCode P01 -siteServer CM01 .EXAMPLE .PARAMETER appName This is the name of the configmgr application that has the deployment type. This accepts input from pipeline. .PARAMETER DeploymentType This is the name of the Deployment Type that you want to copy. .PARAMETER newDTName This is the name of the new DeploymentType. .PARAMETER siteCode This the ConfigMgr site code you are working with. Defaults to LAB .PARAMETER siteServer This the site server you are going to working with. WMI calls are made to this server. It is most likely your primary site server. #> [CmdletBinding()] param ( [Parameter( Position=0, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true) ] $appName, $DeploymentType, $newDTname, $siteCode = "LAB", $siteServer = "cm01.cm.lab" ) begin { write-verbose "Import module" import-module 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1' -force #make this work for you write-verbose "Connect to Provider and change location" if ((get-psdrive $sitecode -erroraction SilentlyContinue | measure).Count -ne 1) { new-psdrive -Name $SiteCode -PSProvider "AdminUI.PS.Provider\CMSite" -Root $SiteServer write-verbose "Connect to the default scope" try { $connectionManager = New-Object Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine.WqlConnectionManager $connectionManager.Connect($siteServer) | Out-Null [Microsoft.ConfigurationManagement.ApplicationManagement.NamedObject]::DefaultScope = [Microsoft.ConfigurationManagement.AdminConsole.AppManFoundation.ApplicationFactory]::GetAuthoringScope($connectionManager) } catch { throw-error "$error[0]" } } write-verbose "Set location $sitecode" set-location $sitecode`: } process { write-verbose "Get Application $appName" try { $Appdt = Get-CMApplication -Name $appName } catch { throw "Unable to get $appName - $error[0]" } $xml = [Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::DeserializeFromString($appdt.SDMPackageXML,$True) $numDTS = $xml.DeploymentTypes.count write-verbose "Number of DT: $numDTS" $dts = $xml.DeploymentTypes foreach ($dt in $dts) { if ($dt.title -eq $DeploymentType ) { write-verbose "Found DT $deploymenttype" $newDeploymentType = $dt.Copy() write-verbose "Set new DT name $newDTname" $newDeploymentType.Title = $newDTname $newDeploymentType.ChangeID() } } if ($newDeploymentType.GetType().name -eq 'DeploymentType') { write-verbose "New DT created" $xml.DeploymentTypes.Add($newDeploymentType) write-verbose "Commit to AppObject" $UpdatedXML = [Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::SerializeToString($XML, $True) $appdt.SDMPackageXML = $UpdatedXML Set-CMApplication -InputObject $appDT } else { write-error "No DeploymentType $newDTname located" } } end { write-verbose "Return to c:" set-location c: } }