PowerShell script to replace a old version with a new version in C# project assembly files.

if (($oldVersion -eq "") -or ($newVersion -eq ""))
{
    throw [InvalidOperationException] "old version and new version arguments are required"
}

$oldVersionPreIndex = $oldVersion.IndexOf("-");
if ($oldVersionPreIndex -eq -1)
{
    $shortOldVersion = $oldVersion;
    $oldVersionSuffix = "";
}
else
{
    $shortOldVersion = $oldVersion.Substring(0, $oldVersionPreIndex);
    $oldVersionSuffix = $oldVersion.Substring($oldVersionPreIndex + 1);
}

$newVersionPreIndex = $newVersion.IndexOf("-");
if ($newVersionPreIndex -eq -1)
{
    $shortNewVersion = $newVersion;
    $newVersionSuffix = "";
}
else
{
    $shortNewVersion = $newVersion.Substring(0, $newVersionPreIndex);
    $newVersionSuffix = $newVersion.Substring($newVersionPreIndex + 1);
}

$files = @(dir SharedAssemblyInfo.cs -recurse) + @(dir src/*/*.csproj) + @(dir *.nuspec -recurse)
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False

ForEach($file in $files)
{
    $content = $originalContent = Get-Content $file
    if ($file.FullName.EndsWith(".cs"))
    {
        $content = $content -replace "AssemblyVersion\(`"$shortOldVersion`"\)", "AssemblyVersion(`"$shortNewVersion`")"
        $content = $content -replace "AssemblyFileVersion\(`"$shortOldVersion`"\)", "AssemblyFileVersion(`"$shortNewVersion`")"
        $content = $content -replace "AssemblyInformationalVersion\(`"$oldVersion`"\)", "AssemblyInformationalVersion(`"$newVersion`")"
        $encoding = "ASCII"
    }
    elseif ($file.FullName.EndsWith(".csproj"))
    {
        $content = $content -replace "<VersionPrefix>$shortOldVersion</VersionPrefix>", "<VersionPrefix>$shortNewVersion</VersionPrefix>"
        $content = $content -replace "<VersionSuffix>$oldVersionSuffix</VersionSuffix>", "<VersionSuffix>$newVersionSuffix</VersionSuffix>"
        $encoding = "UTF8"
    }
    else
    {
        $content = $content -replace "$oldVersion", "$newVersion"
        $encoding = "ASCII"
    }
    if ([String]::Join("`r`n", $originalContent) -ne [String]::Join("`r`n", $content))
    {
        Set-Content -Value $content -Path $file -Encoding $encoding
        Write-Output "Updated $file"
    }
}

Set-Clipboard ("v" + $newVersion)
Write-Output "Remember to tag!"