我正在使用 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)”以忽略注释行?
如果您知道要匹配的字符串始终位于行的开头,您可以在正则表达式中使用行开头标记 (
^
),由于斜杠,它不会与注释行匹配(//
).
你的图案看起来像这样:
$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
查看@wp78de 的答案这里
可以修改它以排除除多行之外的所有类型的注释代码。