Blog

Powershell-Skript zur Verwendung von @CurrentIteration-Abfrage-Token in TFS-Abfragen

Cornell Knulst

Aktualisiert Oktober 22, 2025
2 Minuten
Tweeten

Seit der Einführung von Visual Studio 2013 Update 5 steht ein neues Abfrage-Token (@CurrentIteration) zur Verfügung, mit dem Sie automatisch die aktuelle Iteration Ihres Iterationspfads anhand des heutigen Datums identifizieren können. Wenn Sie dieses Abfrage-Token in Abfragen verwenden, die sich auf die aktuelle Iteration/den aktuellen Druck beziehen, sparen Sie viel Zeit bei der Verwaltung dieser Abfragen (wie in meinem vorherigen Blogpost erwähnt). Sobald Sie jedoch auf Visual Studio 2013 Update 5 oder höher aktualisiert haben, müssen Sie Ihre Abfragen manuell aktualisieren, um dieses neue @CurrentIteration-Abfrage-Token zu verwenden. Das kann Sie eine Menge Zeit kosten. Aus diesem Grund habe ich ein Powershell-Skript erstellt, um das @CurrentIteration-Abfrage-Token automatisch für die gemeinsamen Abfragen Ihres Teamprojekts zu implementieren (siehe den Code unten oder die angehängte Zip-Datei). Nachdem Sie die Datei heruntergeladen/entpackt haben, geben Sie einfach Ihre eigenen Werte für die verschiedenen Variablen an und führen das Powershell-Skript aus. :)

# Load TFS PowerShell Snap-in
if ((Get-PSSnapIn -Name Microsoft.TeamFoundation.PowerShell -ErrorAction SilentlyContinue) -eq $null)
{
    Add-PSSnapin Microsoft.TeamFoundation.PowerShell
}
# Load Referenced Assemblies
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Common")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.WorkItemTracking.Client")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Net.Primitives")
# Variables
$tfsCollectionUrl = "[TEAM PROJECT COLLECTION]"
$tfsTeamProject = "[TEAM PROJECT]"
$username = "[USERNAME]"
$password = "[PASSWORD]"
$currentIterationToReplace = "'[TEAM PROJECT][IterationX]'"
# Connect with the TFS collection
$tfsServer = New-Object System.Uri($tfsCollectionUrl)
$netCred = New-Object System.Net.NetworkCredential($username,$password,"")
$basicCred = New-Object Microsoft.TeamFoundation.Client.BasicAuthCredential($netCred)
$tfsCred = New-Object Microsoft.TeamFoundation.Client.TfsClientCredentials($basicCred)
$tfsCollection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection($tfsServer,$tfsCred)
$tfsCollection.EnsureAuthenticated()
if ($tfsCollection.HasAuthenticated)
{
 #Get Work Item Store object
 $ws = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore")
 #Get work item store of Team Project
 $proj = $ws.Projects[$tfsTeamProject]
 # Update all queries of team project
 $queryHierarchy = $proj.QueryHierarchy;
 $queryRootFolder = $queryHierarchy -as [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder]
 $AllQueryDefsOfProject = GetAllQueriesOfQueryFolder $queryRootFolder
 foreach ($item in $AllQueryDefsOfProject)
 {
     $queryDef = $item -as [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryDefinition]
     $newQueryText = $queryDef.QueryText.Replace($currentIterationToReplace, "@CurrentIteration")
     $queryDef.QueryText = $newQueryText
 }
 $proj.QueryHierarchy.Save()
}
function GetAllQueriesOfQueryFolder([Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder] $queryFolder)
{
    $AllQueryDefinitions = @()
    foreach ($item in $queryFolder)
    {
        $queryItem = $item -as [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryItem]
        if($queryItem -is [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder])
        {
            $subQueryFolder = $queryItem -as [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryFolder]
            $AllQueryDefinitions += GetAllQueriesOfQueryFolder $subQueryFolder;
        }
        elseif($queryItem -is [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryDefinition])
        {
            $queryDef = $queryItem -as [Microsoft.TeamFoundation.WorkItemTracking.Client.QueryDefinition]
            $AllQueryDefinitions += $queryDef
        }
     }
     return $AllQueryDefinitions;
}

EnableCurrentIterationQueryToken

Verfasst von

Cornell Knulst

Cornell works for Xpirit, Hilversum, The Netherlands, as a trainer/architect. He is specialized in the domain of Application Lifecycle Management and Continuous Delivery, with a special focus on Microsoft-based technologies.

Contact

Let’s discuss how we can support your journey.