Functions/AzureDevOps/Remove-ADOWorkItemType.ps1

function Remove-ADOWorkItemType
{
    <#
    .Synopsis
        Removes custom work item types.
    .Description
        Removes custom work item types from Azure DevOps.

        Also removes custom work item type states, rules, and behaviors.
    .Example
        Get-ADOProject -Organization $myOrganization -Project $myProject -PersonalAccessToken $myPat |
            Get-ADOWorkProcess |
            Remove-ADOWorkItemType -WorkItemTypeName ServiceRequest
    .Link
        Get-ADOWorkItemType
    .Link
        New-ADOWorkItemType
    #>

    [CmdletBinding(SupportsShouldProcess,ConfirmImpact='High',
        DefaultParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/workitemtypes/{WorkItemTypeName}')]
    [OutputType([Nullable])]
    param(
    # The Organization
    [Parameter(Mandatory,ValueFromPipelineByPropertyName)]
    [Alias('Org')]
    [string]
    $Organization,

    # The Process identifier. This work process must contain the custom work item type.
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/workitemtypes/{WorkItemTypeName}')]
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/workitemtypes/{WorkItemTypeName}/states/{StateId}')]
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/workitemtypes/{WorkItemTypeName}/rules/{RuleID}')]
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/behaviors/{BehaviorID}')]
    [Alias('TypeID')]
    [string]
    $ProcessID,

    # The name of the custom work item type. Values with a property 'ReferenceName' will be accepted.
    [Parameter(Mandatory,Position=0,ValueFromPipelineByPropertyName)]
    [Alias('ReferenceName')]
    [string]
    $WorkItemTypeName,

    # The id of a custom work item state that will be removed.
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/workitemtypes/{WorkItemTypeName}/states/{StateId}')]
    [string]
    $StateID,

    # The id of a custom work item rule that will be removed.
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/workitemtypes/{WorkItemTypeName}/rules/{RuleID}')]
    [string]
    $RuleID,

    # The id of a custom work item behavior that will be removed.
    [Parameter(Mandatory,ValueFromPipelineByPropertyName,
        ParameterSetName='/{Organization}/_apis/work/processes/{ProcessId}/behaviors/{BehaviorID}')]
    [string]
    $BehaviorID,

    # The server. By default https://dev.azure.com/.
    # To use against TFS, provide the tfs server URL (e.g. http://tfsserver:8080/tfs).
    [Parameter(ValueFromPipelineByPropertyName)]
    [uri]
    $Server = "https://dev.azure.com/",

    # The api version. By default, 5.1.
    # If targeting TFS, this will need to change to match your server version.
    # See: https://docs.microsoft.com/en-us/azure/devops/integrate/concepts/rest-api-versioning?view=azure-devops
    [string]
    $ApiVersion = "5.1-preview"
    )

    dynamicParam { . $GetInvokeParameters -DynamicParameter }
    begin {
        #region Copy Invoke-ADORestAPI parameters
        $invokeParams = . $getInvokeParameters $PSBoundParameters
        #endregion Copy Invoke-ADORestAPI parameters
    }
    process {
        $in = $_
        $psParameterSet = $psCmdlet.ParameterSetName
        if ($WorkItemTypeName -notlike '*.*' -and
            $in.ProcessId -and $in.Name) {
            $WorkItemTypeName = $($in.Name -replace '\W') + '.' + $WorkItemTypeName
        }

        $uri = "$Server".TrimEnd('/') + (. $ReplaceRouteParameter $psParameterSet) + '?'
        if ($Server -ne 'https://dev.azure.com/' -and
            -not $PSBoundParameters['apiVersion']) {

        }
        if ($ApiVersion) {
            $uri += "api-version=$ApiVersion"
        }

        $invokeParams.Method = 'DELETE'
        $invokeParams.Uri    = $uri

        if ($WhatIfPreference) { # If -WhatIf was passed,
            $invokeParams.Remove('PersonalAccessToken') # remove any PersonalAccessToken from invokeparams
            return $invokeParams # and return what would be invoked.
        }

        if (-not $psCmdlet.ShouldProcess("DELETE $uri")) { # If we don't want to delete the endpoint
            return
        }

        Invoke-ADORestAPI @invokeParams
    }
}