我为自己设定了一个仿照LINQPad 挑战的“PowerShell 挑战”,并且很早就经常绊倒。
我正在尝试编写一个简单的脚本来从 Visual Studio 解决方案中的项目文件中提取 TargetFrameworkVersion 元素,以确认项目始终使用单一版本的框架。元素匹配以下 XY={2.0,3.0,4.0,4.5}
<TargetFrameworkVersion>vX.Y</TargetFrameworkVersion>
我做到了这一点:
Get-ChildItem -Recurse -Filter *.csproj | Select-String -Pattern "<TargetFrameworkVersion>(?<version>v[2-4].[05])</TargetFrameworkVersion" | ForEach {$_.Matches}
在很大程度上要感谢ryant的这个回答,但在如何获取“版本”小组赛方面却步履蹒跚。到目前为止,结果似乎是正确的:
Groups : {<TargetFrameworkVersion>v4.0</TargetFrameworkVersion, v4.0}
Success : True
Captures : {<TargetFrameworkVersion>v4.0</TargetFrameworkVersion}
Index : 4
Length : 52
Value : <TargetFrameworkVersion>v4.0</TargetFrameworkVersion
但我试图抓住“版本”(或接近它)失败了:
$_.Matches["version"]
$_.Matches.Groups
$_.Matches | Select-Object Groups
我的问题是如何获取“版本”匹配组?
我尝试了我认为更简单的变体,并且按预期工作:
"<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>" -match "<TargetFrameworkVersion>(?<version>v[2-4].[05])</TargetFrameworkVersion>"
$Matches["version"]
谢谢!
更新:
我接受了 EBGreen 的建议(谢谢!)并开始使用 XML/XPath。在 stej 的帮助下,我成功了:
$ns = @(defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }
Get-ChildItem -Recurse -Filter *.csproj | Select-Xml -xpath '//defaultNamespace:PropertyGroup/defaultNamespace:TargetFrameworkVersion' -namespace $ns | Select-Object -expand Node
在使用非 XML 文件时,我仍然想了解我在 RegEx 代码中做错了什么。