Since the introduction of Visual Studio 2013 update 5, a new query token (@CurrentIteration) is available to automatically identify the current iteration of your iteration path, based on today’s date. By using this query token in queries that are related to the current iteration/sprint, you will save a lot of time in managing those queries (as mentioned in my previous blogpost).

However, once upgraded to Visual Studio 2013 update 5 or higher, you have to manually update your queries to make use of this new @CurrentIteration query token. This may cost you a lot of time. For that reason, I’ve made a powershell script to automatically implement the @CurrentIteration query token for the shared queries of your team project (see the code below or the attached zip file). After downloading/unzipping, just specify your own values for the different variables and run the powershell script. :)

# 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