从AssemblyInfo.cs获取并替换AssemblyVersion

时间:2016-03-24 12:33:19

标签: powershell

我有一个正则表达式我正在使用(仅在测试中)来更新AssemblyVersion文件中的AssemblyInfo.cs。但是,我想知道从.cs文件中提取和替换此值的最佳方法是什么?

这是我最好的猜测,显然,它不起作用,但总体思路已经到位。希望有点优雅的东西。

Get-Content $file | Foreach-Object{
    $var = $_
    if($var -contains "AssemblyVersion"){
        $temp = [regex]::match($s, '"([^"]+)"').Groups[1].Value.Substring(0, $prog.LastIndexOf(".")+1) + 1234
        $var = $var.SubString(0, $var.FirstIndexOf('"') + $temp + $var.SubString($var.LastIndexOf('"'), $var.Length-1))
    }
}

修改

此处的每个请求是我要在AssemblyInfo中更新的行:

[assembly: AssemblyVersion("1.0.0.0")] 

1 个答案:

答案 0 :(得分:29)

并不是真的打算改变你的正则表达式,而是想向你展示你可以尝试的流程。

$path = "C:\temp\test.txt"
$pattern = '\[assembly: AssemblyVersion\("(.*)"\)\]'
(Get-Content $path) | ForEach-Object{
    if($_ -match $pattern){
        # We have found the matching line
        # Edit the version number and put back.
        $fileVersion = [version]$matches[1]
        $newVersion = "{0}.{1}.{2}.{3}" -f $fileVersion.Major, $fileVersion.Minor, $fileVersion.Build, ($fileVersion.Revision + 1)
        '[assembly: AssemblyVersion("{0}")]' -f $newVersion
    } else {
        # Output line as is
        $_
    }
} | Set-Content $path

为每一行运行并检查匹配的行是否存在。找到匹配项后,版本将存储为[version]类型。使用它我们根据需要更新版本。然后输出更新的行。不匹配的行只是按原样输出。

读入文件,因为它在括号中,所以句柄在管道开始处理之前关闭。这让我们回写到同一个文件。循环中的每个传递输出一行,然后发送到set-content以写回文件。

请注意$var -contains "AssemblyVersion"无法按预期工作,因为-contains是一个数组运算符。 -match会更好,只要你知道它是一个正则表达式支持运算符,所以要小心元字符。 -like "*AssemblyVersion*"也可以工作并支持简单的通配符。