ProcessTemplate/ProcessTemplate.psm1
<#
.SYNOPSIS Exports a process template definition to disk. .PARAMETER Collection Specifies either a URL/name of the Team Project Collection to connect to, or a previously initialized TfsTeamProjectCollection object. When using a URL, it must be fully qualified. The format of this string is as follows: http[s]://<ComputerName>:<Port>/[<TFS-vDir>/]<CollectionName> Valid values for the Transport segment of the URI are HTTP and HTTPS. If you specify a connection URI with a Transport segment, but do not specify a port, the session is created with standards ports: 80 for HTTP and 443 for HTTPS. To connect to a Team Project Collection by using its name, a TfsConfigurationServer object must be supplied either via -Server argument or via a previous call to the Connect-TfsConfigurationServer cmdlet. For more details, see the Get-TfsTeamProjectCollection cmdlet. .INPUTS Microsoft.TeamFoundation.Client.TfsTeamProjectCollection System.String System.Uri #> Function Export-TfsProcessTemplate { [CmdletBinding()] Param ( [Parameter(Position=0)] [SupportsWildcards()] [object] $Process = "*", [Parameter(Mandatory=$true)] [string] $DestinationPath, [Parameter()] [ValidateNotNullOrEmpty()] [string] $NewName, [Parameter()] [ValidateNotNullOrEmpty()] [string] $NewDescription, [Parameter(ValueFromPipeline=$true)] [object] $Collection ) Process { $tpc = Get-TfsTeamProjectCollection $Collection $processTemplateSvc = $tpc.GetService([type]"Microsoft.TeamFoundation.Server.IProcessTemplates") if ($Process -is [Microsoft.TeamFoundation.Server.TemplateHeader]) { $templates = @($Process) } else { $templates = Get-TfsProcessTemplate $Process -Collection $Collection } if ($NewName -or $NewDescription) { $templates = $templates | select -First 1 } foreach($template in $templates) { if ($NewName) { $templateName = $NewName } else { $templateName = $template.Name } $tempFile = $processTemplateSvc.GetTemplateData($template.TemplateId) $zipFile = "$tempFile.zip" Rename-Item -Path $tempFile -NewName (Split-Path $zipFile -Leaf) $outDir = Join-Path $DestinationPath $templateName New-Item $outDir -ItemType Directory -Force | Out-Null Expand-Archive -Path $zipFile -DestinationPath $outDir if ($NewName -or $NewDescription) { $ptFile = (Join-Path $outDir "ProcessTemplate.xml") $ptXml = [xml] (Get-Content $ptFile) if ($NewName) { $ptXml.ProcessTemplate.metadata.name = $NewName } if ($NewDescription) { $ptXml.ProcessTemplate.metadata.description = $NewDescription } $ptXml.Save($ptFile) } Remove-Item $zipFile } } } <# .SYNOPSIS Gets information from one or more process templates. .PARAMETER Collection Specifies either a URL/name of the Team Project Collection to connect to, or a previously initialized TfsTeamProjectCollection object. When using a URL, it must be fully qualified. The format of this string is as follows: http[s]://<ComputerName>:<Port>/[<TFS-vDir>/]<CollectionName> Valid values for the Transport segment of the URI are HTTP and HTTPS. If you specify a connection URI with a Transport segment, but do not specify a port, the session is created with standards ports: 80 for HTTP and 443 for HTTPS. To connect to a Team Project Collection by using its name, a TfsConfigurationServer object must be supplied either via -Server argument or via a previous call to the Connect-TfsConfigurationServer cmdlet. For more details, see the Get-TfsTeamProjectCollection cmdlet. .INPUTS Microsoft.TeamFoundation.Client.TfsTeamProjectCollection System.String System.Uri #> Function Get-TfsProcessTemplate { [CmdletBinding()] [OutputType([Microsoft.TeamFoundation.Server.TemplateHeader])] Param ( [Parameter(Position=0)] [SupportsWildcards()] [string] $Name = "*", [Parameter(ValueFromPipeline=$true)] [object] $Collection ) Process { $tpc = Get-TfsTeamProjectCollection $Collection $processTemplateSvc = $tpc.GetService([type]"Microsoft.TeamFoundation.Server.IProcessTemplates") $templateHeaders = $processTemplateSvc.TemplateHeaders() | ? Name -Like $Name foreach($templateHeader in $templateHeaders) { $templateHeader | Add-Member Collection $tpc.DisplayName -PassThru } } } <# .SYNOPSIS Imports a process template definition from disk. .PARAMETER Collection Specifies either a URL/name of the Team Project Collection to connect to, or a previously initialized TfsTeamProjectCollection object. When using a URL, it must be fully qualified. The format of this string is as follows: http[s]://<ComputerName>:<Port>/[<TFS-vDir>/]<CollectionName> Valid values for the Transport segment of the URI are HTTP and HTTPS. If you specify a connection URI with a Transport segment, but do not specify a port, the session is created with standards ports: 80 for HTTP and 443 for HTTPS. To connect to a Team Project Collection by using its name, a TfsConfigurationServer object must be supplied either via -Server argument or via a previous call to the Connect-TfsConfigurationServer cmdlet. For more details, see the Get-TfsTeamProjectCollection cmdlet. .INPUTS System.String #> Function Import-TfsProcessTemplate { Param ( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] [ValidateScript({Test-Path $_ -PathType Container})] [string] $SourcePath, [Parameter()] [ValidateSet("Visible")] [string] $State = "Visible", [Parameter()] [object] $Collection ) Process { if (-Not (Test-Path (Join-Path $SourcePath "ProcessTemplate.xml"))) { throw "Invalid path. Source path ""$SourcePath"" must be a directory and must contain a file named ProcessTemplate.xml." } $tpc = Get-TfsTeamProjectCollection $Collection $processTemplateSvc = $tpc.GetService([type]"Microsoft.TeamFoundation.Server.IProcessTemplates") $tempFile = New-TemporaryFile $zipFile = "$tempFile.zip" Rename-Item $tempFile -NewName (Split-Path $zipFile -Leaf) Compress-Archive -Path "$SourcePath/**" -DestinationPath $zipFile -Force $ptFile = (Join-Path $SourcePath "ProcessTemplate.xml") $ptXml = [xml] (Get-Content $ptFile) $name = $ptXml.ProcessTemplate.metadata.name $description = $ptXml.ProcessTemplate.metadata.description $metadata = $ptXml.ProcessTemplate.metadata.OuterXml $processTemplateSvc.AddUpdateTemplate($name, $description, $metadata, $State, $zipFile); Remove-Item $zipFile } } |