我有一个正则表达式我正在使用(仅在测试中)来更新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")]
答案 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*"
也可以工作并支持简单的通配符。