8

プロジェクト参照の大規模な編集を行うために、Powershell を使用して csproj ファイルを操作しています。これまでのところ、次の行を使用して ProjectReferences の Include 属性を編集できました。

    $projectXml = [xml](Get-Content $_.Project.FullName)
    Add-TfsPendingChange -edit $_.Project.FullName -ErrorAction Stop
    $projectXml | Select-Xml -namespace @{msb = "http://schemas.microsoft.com/developer/msbuild/2003"} -xpath "//msb:ProjectReference[msb:Project='$projectGuid']" | Select-Object -ExpandProperty Node | foreach { $_.Include = "$newPath" }
    $projectXml.Save($_.Project.FullName)

これは機能し、期待どおりに適切な ProjectReferences の Include 属性を置き換えます。ただし、すべてのタグを独自の行にフォーマットするなど、追加の「無害な」変更がたくさんあります。
<FileUpgradeFlags></FileUpgradeFlags>

になる

<FileUpgradeFlags>
</FileUpgradeFlags>

このような副作用のない編集を実行する方法はありますか?

編集: 他の理由でこの投稿を見つけた人にわかりやすくするために、Select-MsBuildXml は、名前空間パラメーターを msbuild 名前空間で事前に読み込み、後でノード プロパティを展開する Select-Xml の周りに書いた単なるラッパー関数です。

4

1 に答える 1

12

私は数年前に多くのVSプロジェクト操作を行いました。XmlDocumentを作成し、Loadを直接使用する(Get-Contentを使用してXMLにキャストするのではなく)ように思えます。

$path = "C:\temp\foo.csproj"
$proj = new-object system.xml.xmldocument
$proj.PreserveWhitespace = $true
$proj.Load($path)
...
$proj.Save($path)

更新-PreserveWhitespace上記のようにXMLドキュメントをロードする前に、プロパティをtrueに設定してみてください。

于 2011-03-01T00:55:12.727 に答える