2012-07-31 25 views
1

我給自己設置了一個「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文件時,我在做什麼錯誤的正則表達式代碼

+1

如果你正在使用的文件是有效的個XML,然後使用正則表達式是做錯了。看看[xml]類型的加速器。 – EBGreen 2012-07-31 21:12:11

回答

2

.NET正則表達式對象模型使用集合集合。修改你的最終Foreach到:

... | Foreach {$_.Matches | Foreach {$_.Groups["version"].Value}} 

順便說一句我同意EBGreen,你想用這個XML。

0

與EBGreen和Keith同意使用XML

$xml = get-content "myproj.vcxproj" 
(([xml]$xml).Project.PropertyGroup | ? {$_.Label -eq 'Globals'}).TargetFrameworkVersion