You will need to update the script Source and Target Server URLs, TPC and Projects. I went down the path to hard code them and not take them as arguments so users did not have to enter anything. The script will throw errors if the query being migrated is not valid on the target project.
function ProcessQueryItem ($queryFolder, $parentFolder, $sourceProjectName) { $newItem = $null foreach ($subQuery in $queryFolder) { if ($subQuery -is [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder]) { $newItem = new-object Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder -ArgumentList @($subQuery.Name) if (-not $parentFolder.Contains($subQuery.Name)) { Write-Host "Adding Query Folder $subQuery" $parentFolder.Add($newItem); $WIStoreRight.Projects[$RightProject].QueryHierarchy.Save() ProcessQueryItem $subQuery $newItem $sourceProjectName } else { Write-Host "Query Folder "$subQuery.name" already exists" -foregroundcolor Yellow } } else { Write-Host "Creating query "$subQuery.Name $oldDef = [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryDefinition]$subQuery $queryText = $oldDef.QueryText.Replace("$sourceProjectName\", "$RightProject\") $queryText = $queryText.Replace("[System.IterationPath] under '" + $sourceProjectName + "'", "[System.IterationPath] under '" + $RightProject +"'"); $newItem = new-object Microsoft.TeamFoundation.WorkItemTracking.Client.QueryDefinition -ArgumentList @($subQuery.Name,$queryText) if ($parentFolder.Contains($subQuery.Name) -ne $true ) { $parentFolder.Add($newItem) $WIStoreRight.Projects[$RightProject].QueryHierarchy.Save() } else { Write-Host "Query Definition $subQuery already exists" -foregroundcolor Yellow } } } } [URI]$Projecturileft = "http://sourceServer:8080/tfs/SourceTPC/" $leftProject = "SourceProject" [URI]$ProjecturiRight = "http://targetServer:8080/tfs/TargetTPC/" $RightProject = "TargetProject" [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.WorkItemTracking.Client') [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Client') [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Server') $tfsleft = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($Projecturileft) $WIStoreleft = $tfsleft.GetService([Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore]) $WIStoreleft.RefreshCache($true) $WIStoreleft.SyncToCache() | out-null $LeftQuerystore = $WIStoreleft.Projects[$LeftProject].QueryHierarchy $tfsRight = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($ProjecturiRight) $WIStoreRight = $tfsRight.GetService([Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore]) $WIStoreRight.RefreshCache($true) $WIStoreRight.SyncToCache() | out-null foreach ($queryFolder in $LeftQuerystore) { if ($queryFolder.IsPersonal) { $RightMyQueriesFolder = [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder]$WIStoreRight.Projects[$RightProject].QueryHierarchy["My Queries"]; ProcessQueryItem $queryFolder $RightMyQueriesFolder $leftProject Write-Host "Personal Queries Migrated" } }
No comments:
Post a Comment