Remove-ADOIterationPath.ps1
function Remove-ADOIterationPath { <# .Synopsis Removes an Azure DevOps IterationPath. .Description Removes an Azure DevOps IterationPath. IterationPaths are used to logically group work items within a project. .Example Remove-ADOIterationPath -Organization MyOrg -Project MyProject -IterationPath MyIterationPath .Link Add-ADOIterationPath .Link Get-ADOIterationPath #> [CmdletBinding(SupportsShouldProcess,ConfirmImpact='High')] [OutputType([Nullable],[PSObject])] param( # The Organization [Parameter(Mandatory,ValueFromPipelineByPropertyName)] [Alias('Org')] [string] $Organization, # The Project [Parameter(Mandatory,ValueFromPipelineByPropertyName)] [string] $Project, # The IterationPath [Parameter(Mandatory,ValueFromPipelineByPropertyName)] [Alias('Path')] [string] $IterationPath, # 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 $q = [Collections.Queue]::new() } process { $q.Enqueue(@{} + $psboundParameters) } end { $c,$t, $id = 0, $q.Count, [Random]::new().Next() while ($q.Count) { $qi = $q.Dequeue() foreach ($kv in $qi.GetEnumerator()) { $ExecutionContext.SessionState.PSVariable.Set($kv.Key, $kv.Value) } if ($t -gt 1) { $c++ Write-Progress "Removing Iteration Paths" "$IterationPath " -PercentComplete ($c * 100 / $t) -Id $id } if ($IterationPath -like "\$project\*") { $IterationPath = @($IterationPath -split '\\', 4)[-1] } $IterationPathUrl = "/{Organization}/{Project}/_apis/wit/classificationNodes/Iterations/$IterationPath" $uri = $Server.ToString().TrimEnd('/') + (. $ReplaceRouteParameter $IterationPathUrl) + '?' + $( if ($Server -ne 'https://dev.azure.com' -and -not $psBoundParameters['apiVersion']) { $apiVersion = "2.0" } if ($ApiVersion) { "api-version=$ApiVersion" } ) $invokeParams.Uri = $uri $invokeParams.Method = 'DELETE' if ($WhatIfPreference) { $invokeParams.Remove('PersonalAccessToken') $invokeParams continue } if (-not $PSCmdlet.ShouldProcess("Remove IterationPath $IterationPath")) { continue } $typeName = "$Organization.IterationPath", "$Organization.$project.IterationPath", "PSDevOps.IterationPath" Invoke-ADORestAPI @invokeParams -PSTypeName $typeName } if ($t -gt 1) { Write-Progress "Removing Iteration Paths" " " -Completed -Id $id } } } |