使用PowerShell自动更新VS工程的编译版本号

使用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值,即可实现功能。
发布该文章也是同样方便自已后续查阅方法。倘若大家使用有不当的地方,请尽管吐槽,呵呵。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值