如何使用PowerShell读取MSBuild PropertyGroup的值?

时间:2015-02-06 14:36:55

标签: xml powershell

我有以下MSBuild(TestBuild.xml)文件:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <Import Project="folderA\A.targets"/>

  <!-- bunch of stuff -->
  <PropertyGroup>    
    <ApplicationName>MyApp</ApplicationName>
    <SolutionName>MySolution</SolutionName>
    <VersionFile>Version.cs</VersionFile>
    <TargetPackageVersion>$(RELEASE_VERSION)</TargetPackageVersion>
    <BuildPlatform Condition=" '$(BuildPlatform)' == '' ">x86</BuildPlatform>
    <TestAssembliesPattern>*Tests*.dll</TestAssembliesPattern>
    ...    
  </PropertyGroup>

  <!-- bunch of more stuff -->
  <PropertyGroup>
    <ConfigurationContentFolder>$(MSBuildProjectDirectory)\Configuration</ConfigurationContentFolder>
    <PluginName>ABC</PluginName>
  </PropertyGroup>
  ...
</Project>

我希望能够在这种情况下获得VersionFile节点的值Version.cs我一直在玩XPath,希望以下内容能够正常工作:

$xdoc = [xml] $xdoc = get-content ".\TestBuild.xml"
$xdoc.SelectSingleNode("//VersionFile") | select { $_.InnerText }
$xdoc.SelectSingleNode("VersionFile") | select { $_.InnerText }

但到目前为止我还没有运气。任何帮助都很有用。

2 个答案:

答案 0 :(得分:2)

Xml有一个命名空间,因此您必须限定元素名称。使用Select-Xml评估带有命名空间的XPath:

$xml = [xml](get-content ".\TestBuild.xml")
$ns = @{ msb = "http://schemas.microsoft.com/developer/msbuild/2003" }
Select-Xml $xml -Namespace $ns -XPath "//msb:VersionFile" | foreach { $_.Node.InnerText }

答案 1 :(得分:1)

我认为您需要执行MSBuild,运行自定义目标并捕获结果值。

将msbuild项目作为xml文件处理可能无法获得所需的结果。考虑动态定义属性或有条件地计算属性的情况,基于配置设置(调试与发布等)。