2011-02-28 19 views
6

Proje referanslarının büyük ölçekli düzenlemesi için Powershell kullanarak csproj dosyaları ile çalışıyorum. Şimdiye kadar aşağıdaki satırları kullanarak ProjectReferences üzerinde içer özelliklerini düzenlemek için idare ettik:Powershell ile Cerrahi XML düzenleme

$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) 

Bu çalışır ve beklediğim gibi uygun ProjectReferences üzerinde niteliğini dahil değiştirir. Bununla birlikte, tüm etiketleri kendi satırlarında biçimlendirmek gibi birçok "zararsız" değişiklik yapılır.
<FileUpgradeFlags></FileUpgradeFlags>

<FileUpgradeFlags>
</FileUpgradeFlags>

Bu tür yan etkileri yok bu gibi bir düzenlemeyi gerçekleştirmek için herhangi bir yolu var mı

olur?

düzenleme: Bu gönderiyi başka nedenlerle bulan herhangi bir kişiye açıklık getirmek için Select-MsBuildXml, ad alanı parametresini msbuild ad alanıyla önceden yükleyen Select-Xml etrafında yazdığım bir sarmalayıcı işlevdir ve daha sonra düğüm özelliğini genişletir .

+0

Ekstra boşlukların sizin için neden sorun oluşturduğunu merak ediyorum. –

+1

Temelde, değişiklikleri gözden geçirmede ek çalışma oluşturması ve kaynak denetiminde gereksiz bir kesinti yaratması nedeniyle. Patolojik durumda VS, tüm bu kırılmış etiketleri tek satırlı elemanlar halinde yeniden biçimlendirmeyi seçer, böylece bir dahaki sefere csproj belgesinde bir değişiklik yapılır ve her ikisi de tahriş edici bir biçim kıskacında kilitlenir. – bwerks

+1

Bu cevap başkaları için daha uygulanabilir yapmak için Select-MsBuildXml yerine Select-XML ile yapılabilir (ve gösterilir)? –

cevap

12

Birkaç yıl önce bir çok VS proje manipülasyonu yaptım.

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

Güncelleme - XML ​​belgesi yüklemeden önce true PreserveWhitespace özelliğini ayarlamayı deneyin gösterildiği gibi: XmlDocument oluşturma ve doğrudan Load kullanarak gibi görünüyor (Get-İçerik ve XML döküm karşı) benim için daha iyi çalıştı yukarıdaki.

+0

İpucu için teşekkürler, ancak maalesef sonucun aynı olduğu anlaşılıyor. Umarım VS standart olmayan biçimlendirme ile nazik olacaktır. – bwerks

+1

Cevabı XmlDocument üzerinde 'PreserveWhitespace' özelliği ayarlamayı dahil ederek güncelleştirdim. Bu yardımcı görünüyor. –

+0

En mükemmel! Bu bana bir sürü inceleme baş ağrısını kurtaracak. Çok teşekkür ederim! – bwerks