2011-02-28 2 views
6

Powershell을 사용하여 프로젝트 참조의 대규모 편집을 수행하는 csproj 파일 작업 중입니다. 지금까지 나는 다음과 같은 라인을 사용 ProjectReferences에 포함 속성을 편집하는 데 성공했습니다Powershell을 사용한 외과 적 XML 편집

$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에 속성을 포함 대체합니다. 그러나 모든 태그를 자체 줄에 서식 지정하는 등 많은 "무해한"변경 사항이 있습니다.
<FileUpgradeFlags></FileUpgradeFlags>

<FileUpgradeFlags>
</FileUpgradeFlags>

등의 부작용을 가지고 있지 않는이 같은 편집을 수행 할 수있는 방법이 있나요

이됩니까?

편집 : 다른 이유로이 게시물을 찾은 분이라면 Select-MsBuildXml은 msbuild 네임 스페이스로 네임 스페이스 매개 변수를 미리로드하고 나중에 노드 속성을 확장하는 Select-Xml을 중심으로 작성한 래퍼 함수입니다. .

+0

추가 공백이 왜 당신에게 문제가되는지 알고 싶습니다. –

+1

주로 변경 사항을 검토하는 데 추가 작업을 생성하고 소스 제어에 불필요한 변경을 생성하기 때문입니다. 병리학적인 경우 VS는 이러한 모든 줄 바꿈 태그를 단일 줄 요소로 다시 형식화하여 다음 번에 csproj 문서가 변경 될 때 모든 내용을 뒤집어서 두 가지가 짜증나는 형식 잡기에 잠기 게됩니다. – bwerks

+1

이 대답을 다른 사람에게 더 잘 적용하려면 Select-MsBuildXml 대신 Select-XML을 사용하여이 작업을 수행 할 수 있습니까? –

답변

12

나는 몇 년 전 VS 프로젝트 조작을 많이했다.

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

업데이트는 - XML ​​문서를로드하기 전에 true로 PreserveWhitespace 속성을 설정하십시오 같이 다음을 XmlDocument를 생성하고 직접로드를 사용하는 것 같다 (은 Get-컨텐츠를 사용하여 XML로 캐스팅 대) 나를 위해 더 나은 일 위.

+0

힌트를 보내 주셔서 감사합니다.하지만 불행히도 그 결과는 같습니다. 바라 건데 VS는 비표준 형식에 친숙합니다. – bwerks

+1

XmlDocument의 PreserveWhitespace' 속성 설정을 포함하도록 답변을 업데이트했습니다. 이것은 도움이되는 것 같습니다. –

+0

가장 우수! 이렇게하면 많은 검토 두통을 줄일 수 있습니다. 고마워요! – bwerks