1

私は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 コードで何が間違っているのかを理解したいと思います。

4

2 に答える 2

2

.NET 正規表現オブジェクト モデルは、コレクションのコレクションを使用します。最終的な Foreach を次のように変更します。

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

ところで、私は EBGreen に同意します。これには XML を使用したいと考えています。

于 2012-07-31T22:39:14.873 に答える
0

XML の使用に関して EBGreen と Keith に同意する

$xml = get-content "myproj.vcxproj"
(([xml]$xml).Project.PropertyGroup | ? {$_.Label -eq 'Globals'}).TargetFrameworkVersion
于 2012-07-31T23:16:16.590 に答える