我給自己設置了一個「012S」後建模的「PowerShell挑戰」,並且在早期和頻繁地陷入困境。奮力提取正則表達式組匹配
我正試圖編寫一個簡單的腳本從Visual Studio解決方案中的項目文件中提取TargetFrameworkVersion元素,以確認項目始終使用單個版本的框架。
Get-ChildItem -Recurse -Filter *.csproj | Select-String -Pattern "<TargetFrameworkVersion>(?<version>v[2-4].[05])</TargetFrameworkVersion" | ForEach {$_.Matches}
從ryant這在很大程度上歸功於對this答案,但絆腳石爲:元件,其中XY = {2.0,3.0,4.0,4.5}
<TargetFrameworkVersion>vX.Y</TargetFrameworkVersion>
我得到這個遠遠以下匹配如何抓住「版本」小組比賽。結果似乎是正確的這一點:
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"]
謝謝!
UPDATE:
我把EBGreen的建議(感謝!),並與XML/XPath的一個旋轉。隨着stej的help,我成功了:
$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文件時,我在做什麼錯誤的正則表達式代碼。
如果你正在使用的文件是有效的個XML,然後使用正則表達式是做錯了。看看[xml]類型的加速器。 – EBGreen 2012-07-31 21:12:11