从文件中获取字符串的 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.*
希望对您有所帮助。
问题
我正在 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.*
希望对您有所帮助。