One of the problems that seems to come up semi-frequently is, “We need to update all x files to have y!” The old solution to this was manually going through all x files and updating them to have y. However, this can be accomplished quickly and easily using Powershell.
Here’s an example. We had a number of VB6 project files whose BCO paths were set to use a mapped “O:” drive that no longer existed. Instead, these projects should be using a relative path. There were 100 or so of these projects that needed to be updated, and I was able to check them out from TFS and make the change to all of them in a matter of seconds by using the following script (sorry for the formatting!):
Get-ChildItem "C:\Code" -recurse | Where-Object {$_.Extension -eq ".vbp"} | ForEach-Object {Write-Host " "$_.FullName; & "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\TF.exe" checkout "$($_.FullName)" | Out-Null; (Get-Content $_.FullName) | ForEach-Object {$_ -replace "O:\\.*?\\BCO\\", "..\..\BCO\"} | Set-Content $_.FullName -Force}
And another example. I needed to update the revision numbers of all projects in a sub-directory to be automatic. Here’s the same script modified to accomplish that. I’ve made this more re-usable by accepting parameter values from the command line.
# example usage: .\UpdateVersion.ps1 -path "C:\Code" -build "1.0.0.*" # get param values param( [int] $build, [string] $path, [string] $root) if ($build -eq $null) { $build = Read-Host "Build number:" } if ($path -eq $null) { $path = ".\" } # $root will be trimmed from start of directory string # when checking for exceptions if ($root -eq $null) { $root = "c:\" } # $exceptionDirs will not have their versions updated $exceptionDirs = "test" Write-Host "Updated the following files:" # recursively search $path for AssemblyInfo.cs # if found, update version number & save Get-ChildItem $path -recurse | Where-Object {$_.Name -eq "AssemblyInfo.cs"} | Where-Object {$exceptionDirs -notcontains $_.Directory.ToString().ToUpper().TrimStart($root.ToUpper())} | ForEach-Object {Write-Host " "$_.FullName; & "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\TF.exe" checkout "$($_.FullName)"; (Get-Content $_.FullName) | ForEach-Object {$_ -replace "(?(\d+\.){3})\d+", "`${ver}$build"} | Set-Content $_.FullName -Force}
❤ Powershell!