从AssemblyInfo.cs获取并替换AssemblyVersion

Nea*_*alR 12 powershell

我有我使用(仅测试)来更新一个正则表达式AssemblyVersionAssemblyInfo.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))
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这里的每个请求是我要在AssemblyInfo中更新的行:

[assembly: AssemblyVersion("1.0.0.0")] 
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 31

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

$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
Run Code Online (Sandbox Code Playgroud)

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

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


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

  • 哇,这很完美.我不知道powershell特别能够访问Major/Minor等文件版本.谢谢!!! (2认同)