PowerShell从文件中获取字符串的问题

时间:2017-11-13 22:15:34

标签: regex powershell lookahead lookbehind

问题

我正在使用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过滤器确保变量仅存储目标值?

1 个答案:

答案 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.*

希望有所帮助。