我正在使用powershell中的自动版本控制脚本,我试图从AssemblyInfo.cs文件中提取一行文本。然而,尽管付出了很多努力,我似乎无法按预期工作。
经过多次试验和错误以达到预期的结果后,我找到了以下内容以接近我想要实现的目标:
# Constants
$Assembly = Get-Item "C:\generalfilepath\*\Assembly.cs"
$regex = '(?<!\/\/ \[assembly: AssemblyVersion\(")(?<=\[assembly: AssemblyVersion\(")[^"]*'
$CurrentVersion = GC $Assembly
$CurrentVersion = $CurrentVersion -match $regex
Write-Host "CurrentVersion = $CurrentVersion
我希望看到:CurrentVersion = 1.0.0.0
或类似内容,但我得到的是:CurrentVersion = [assembly: AssemblyVersion("1.0.0.0")]
我一直在搜索有关如何在PowerShell中正确使用正则表达式的示例,但我还没有发现任何包含正则表达式本身的内容......因此,我希望有人可以帮助我引导我朝着正确的方向前进,或指出我做错了什么。
尽管使用了正则表达式过滤器,但我得到的是整行而不是我想要的值。如何使用lookbehind和lookahead regex过滤器确保变量仅存储目标值?
答案 0 :(得分:1)
您可以尝试:
C:\> ([string] (Get-Content \AssemblyInfo.cs)) -match 'AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\)'
True
之后,结果将存储在$Matches[1]
C:\> $Matches[1]
6.589.0.123
请注意将Get-Content
的结果转换为[string]
,否则$Matches
将为$null
。有关完整说明,请参阅此answer。
如果你想使用像^\[assembly: AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\)
这样的更“贪婪”的正则表达式,其中还包括一个以^\[assembly:
开头的检查([assembly
),你必须走过[string[]]
{1}}数组Get-Content
返回:
> gc .\AssemblyInfo.cs | % { $_ -match '^\[assembly: AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\)' }
> $Matches[1]
6.589.0.*
希望有所帮助。