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

PowerShell Issues with getting string from file

问题

我正在 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 中正确使用正则表达式的示例,但我没有真正找到任何包含正则表达式本身的内容...因此,我希望这里有人可以帮助我要么引导我朝着正确的方向前进,要么指出我做错了什么。

问题

尽管使用了正则表达式过滤器,但我得到的是整行,而不仅仅是我想要的值。如何确保变量仅存储使用后向和先行正则表达式过滤器的目标值?

你可以试试:

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

如果你想使用更多 "greedy" 的正则表达式,比如 ^\[assembly: AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\),它还包括一个字符串以 [assembly 开头的检查 (^\[assembly:),你必须遍历 [string[]] 数组 Get-Content returns:

> gc .\AssemblyInfo.cs | % { $_ -match '^\[assembly: AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\)' }

> $Matches[1]
6.589.0.*

希望对您有所帮助。