【问题标题】:PowerShell Issues with getting string from file从文件中获取字符串的 PowerShell 问题
【发布时间】:2017-11-14 15:03:40
【问题描述】:

问题

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

【问题讨论】:

  • Get-Content 返回一个行数组,-match 在行数组上过滤匹配正则表达式的行。不清楚您是否期待一个文件,因为您在路径中使用了通配符,但无论如何您都需要在使用 -match 后引用 $Matches 以获取匹配详细信息。可能Get-Content -Raw 得到一个字符串,然后-match 然后$matches[1]

标签: regex powershell lookahead lookbehind


【解决方案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[]] 数组 Get-Content返回:

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

> $Matches[1]
6.589.0.*

希望对您有所帮助。

【讨论】:

  • 谢谢。这大大澄清了事情。我完全感到困惑和沮丧,因为我觉得自己就像一只在轮子上的仓鼠,跑得不快。感谢您的解释和更多信息的链接。
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 2015-08-06
  • 1970-01-01
  • 2013-06-24
  • 2022-01-16
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多