我有一个正则表达式正在使用(仅在测试中)从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")]

最佳答案

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

$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*"也可以使用并支持简单的通配符。

关于powershell - 从AssemblyInfo.cs获取并替换AssemblyVersion,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36200323/

10-11 07:47