使用PowerShell自动更新VS工程的编译版本号
最近做的项目有点多,调试也多,每次调试编译后,发现生成的应用程序或链接库的版本号一直不变,发布工程后,想通过应用程序或链接库自身的版本号回溯源代码也不太方便。
因此从网上找了好几种自动更新版本号的方法,并参考做了一个修改,感觉还算是蛮好用的小工具。
现共享给大家使用,复制以下代码内容,将其保存为AutoUpdateVersion.ps1文件,再将此文件复制到工程目录下,再打开工程属性,将工程编译前事件中输入:PowerShell.exe -ExecutionPolicy RemoteSigned -File $(ProjectDir)AutoUpdateVersion.ps1.。
1、通过当前编译日期来自动更版本号:
$SolutionPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$FileList = Get-ChildItem $SolutionPath -Recurse AssemblyInfo.cs
$AppDateVer =Get-Date -Format 'yyyy.MM.dd'
$revision=[regex]"(?!Version\("")(\d{1,}.\d{1,}.\d{1,}).(\d{1,})(?=""\))"
Foreach($filename in $FileList)
{
$filename = $filename.FullName
$Content = Get-Content $filename
$version = $revision.Matches($Content) | select Value
$news=[regex]"(\d{1,}.\d{1,}.\d{1,}).(\d{1,})"
$temp=$version[0]
$version[0] -match $news
$version=$Matches
[int]$tempVer=1
if($version[1] -ceq $AppDateVer) #日期相同则获取修订版本号并+1更新
{
[int]$tempVer=[convert]::ToInt32($version[2], 10)+1
}
$Appver =$AppDateVer,$tempVer -join '.'
$Appver
(Get-Content $filename) |
Foreach-Object {
$_ -replace $version[0], $Appver
} |
Set-Content $filename
}
2、通过SVN服务器的版本号自动更新版本号
$SolutionPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$FileList = Get-ChildItem $SolutionPath -Recurse AssemblyInfo.cs <#获取到当前工程的AssemblyInfo.cs#>
$revision=[regex]"(?!Version\("")(\d{1,}.\d{1,}.\d{1,}).(\d{1,})(?=""\))"
Foreach($filename in $FileList)
{
$p= $filename.FullName.ToString().Replace("\Properties\AssemblyInfo.cs","")
<#获取当前目录在SVN服务器上的完整URL,输出到临时文件中#>
svn info $p >~1.txt
$urlflag="URL: https://*"
$verflag="Last Changed Rev: *"
$dateflag="Last Changed Date:*"
$infoText=Get-Content ~1.txt |
Foreach-Object {
<#从输出的临时文件中截取完整URL#>
if ( $_ -like $urlflag ) {$url=$_ -replace "URL: ", ""}
if ( $_ -like $verflag ) {
<#获取当前工程在svn checkout时的版本号#>
$ver=($_.ToString().Replace("Last Changed Rev: ","") -as [int64])
}
if ( $_ -like $dateflag ) {
<#获取当前工程在svn checkout时的版本号的上传日期#>
$tmpdate=$_.ToString().Replace("Last Changed Date: ","").Split(' ')[0]
$date = Get-Date $tmpdate -Format 'yyyy.MMdd'
}
}|
<#Write-Host $url#>
<#获取对应URL在服务器中的最新版本号,输出到临时文件中#>
<#如果不需要默认以最新版本的版本号编译时,下一行的svn info 的执行过程直接删除掉#>
svn info $url >~1.txt
$infoText=Get-Content ~1.txt |
Foreach-Object {
if ( $_ -like $verflag ) {
<#获取最后一次上传的(即最新)版本号#>
$ver=($_.ToString().Replace("Last Changed Rev: ","") -as [int64])
}
if ( $_ -like $dateflag ) {
<#获取最后一次上传的日期#>
$tmpdate=$_.ToString().Replace("Last Changed Date: ","").Split(' ')[0]
$date = Get-Date $tmpdate -Format 'yyyy.MMdd'
}
}|
<#Write-Host $ver#>
del ~1.txt <#删除临时文件#>
$ver1=$ver%65535 <#取余数#>
$ver2= $ver/65535 -as [int] <#取整除值#>
$Appver="1.0",$ver2,$ver1 -join '.' <#组合,并得到与SVN版本号一致的转换的最终的版本号#>
$filename = $filename.FullName
$Content = Get-Content $filename
$version = ($revision.Matches($Content) | select Value)[0].Value <#从原文件中查找到需要替换版本号内容#>
(Get-Content $filename) |
Foreach-Object {
$_ -replace $version, $Appver <#替换版本号内容#>
} |
Set-Content -Path $filename -Encoding UTF8 <#将替换版本号后的内容保存到AssemblyInfo.cs#>
$Appver <#控制台输出当前编译版本号#>
}
第二种是通过SVN服务器上的版本号进行更新当前工程的版本号,有个不足的地方就是编译之后,本地的AssemblyInfo.cs文件会与服务器的AssemblyInfo.cs不一致。
优化方法:不要将工程的AssemblyInfo.cs上传SVN服务,将AssemblyInfo.cs复制个副本,然后将副本文件上传SVN,编译时通过副本自动生成工程的AssemblyInfo.cs文件,只需要稍微修改一下上述代码中最后几行的Get-Content和Set-Content的$filename值,即可实现功能。
发布该文章也是同样方便自已后续查阅方法。倘若大家使用有不当的地方,请尽管吐槽,呵呵。