在 PowerShell 中,如何排除注释行,即使它们包含我想要包含的模式?

问题描述 投票:0回答:2

我正在使用 PowerShell 脚本读取文件以获取程序集版本,我将其用作输出文件名的一部分。但是,我正在阅读的文件还包含注释(“//”),我想忽略它们。

这是我的输入文件中的两行。第一个是要忽略的注释行,第二个是具有所需值的行:

// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]

这是我当前的脚本:

 param (
    [string]$path
   ,[string]$file = "AssemblyInfo.cs"
   ,[string]$projectName)

# Search for the AssemblyVersion to be appended to the filename
$pattern = '\[assembly: AssemblyVersion\("(.*)"\)\]'
(Get-Content $path\$file) | ForEach-Object{
    if($_ -match $pattern){
        $fileVersion = [version]$matches[1]
    }
} 
Write-Host $projectName-$fileVersion

当前模式与输入的行匹配。因为评论没有有效版本,所以会产生错误:

Cannot convert value "1.0.*" to type "System.Version". 
Error: "Input string was not in a correct format."
At C:\Scripts\Powershell\Get-FileName.ps1:10 char:36
+         $fileVersion = [version]$matches[ <<<< 1]
+ CategoryInfo          : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

如何修改 $pattern 值或“if($_ -match $pattern)”以忽略注释行?

regex powershell include match
2个回答
1
投票

如果您知道要匹配的字符串始终位于行的开头,您可以在正则表达式中使用行开头标记 (

^
),由于斜杠,它不会与注释行匹配(
//
).

你的图案看起来像这样:

$pattern = '^\[assembly: AssemblyVersion\("(.*)"\)\]'

使用 -match 进行测试

$oldRegex = '\[assembly: AssemblyVersion\("(.*)"\)\]'
$newRegex = '^\[assembly: AssemblyVersion\("(.*)"\)\]'

'// [assembly: AssemblyVersion("1.0.*")]' -match $oldRegex // returns True
'// [assembly: AssemblyVersion("1.0.*")]' -match $newRegex // returns False
'[assembly: AssemblyVersion("1.0.*")]' -match $oldRegex // returns True
'[assembly: AssemblyVersion("1.0.*")]' -match $newRegex // returns True

0
投票

查看@wp78de 的答案这里

可以修改它以排除除多行之外的所有类型的注释代码。

© www.soinside.com 2019 - 2024. All rights reserved.