无法使用PowerShell更新msbuild proj文件中的值

时间:2014-07-03 21:53:29

标签: powershell msbuild

我正在尝试使用powershell读取.csproj文件,方法是将其转换为xml文件以增加WPF应用版本值。我可以毫无问题地读取值并增加版本值但是当我尝试使用新值保存文件时,该值不会被保存。我在这个问题中粘贴的代码是更新QA详细信息。

我正在尝试阅读以下文件。我如何更新和保存文件

<Choose>
<When Condition=" '$(BuildEnvironment)' == 'QA' ">
  <PropertyGroup>
    <ApplicationVersion>1.0.0.1</ApplicationVersion>
    <PublishDirectory>C:\TestDirectory</PublishDirectory>
    <InstallUrl>http://testurl/testapp</InstallUrl>
    <ProductName>Test1.QA</ProductName>
    <PublishAssemblyName>Test1.QA</PublishAssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <Tokens Include="ApplicationManifestFileName">
      <ReplacementValue>Test1.QA.application</ReplacementValue>
      <Visible>false</Visible>
    </Tokens>
  </ItemGroup>
</When>
<When Condition=" '$(BuildEnvironment)' == 'Production' ">
  <PropertyGroup>
    <ApplicationVersion>1.0.0.0</ApplicationVersion>
    <PublishDirectory>C:\TestDirectory2</PublishDirectory>
    <InstallUrl>http://test2url/test2app/</InstallUrl>
    <ProductName>Test=2.Prod</ProductName>
    <PublishAssemblyName>Test2.Prod</PublishAssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <Tokens Include="ApplicationManifestFileName">
      <ReplacementValue>Tes2.Prod.application</ReplacementValue>
      <Visible>false</Visible>
    </Tokens>
  </ItemGroup>
</When>

$Test1QAMSBuildFile = 'C:\Directory\Test.csproj'
[xml]$Test1QABuildVersion = Get-Content $Test1QAMSBuildFile
$CurrentQAVersion= $Test1QABuildVersion.Project.Choose.when.PropertyGroup | ? { $_.ProductName -eq 'Test1.QA' } | Select-Object -Property ApplicationVersion
$PropertyVersion= $CurrentQAVersion.ApplicationVersion
$UpdateVersion= $PropertyVersion.split(".")
$major= [int] ($Updateversion[0])
$minor= [int] ($Updateversion[1])
$patch= [int] ($Updateversion[2])
$revision=[int] ($Updateversion[3]) 
$newrevisionversion= $revision+1
$newVersion =( [string] $major )+ "."+ ( [string] $minor) +"."+ ([string]$patch ) +"."+ ([string]$newrevisionversion )
$UpdateVersion ="$newVersion"
$TestQABuildVersion.Save("Test1QAMSBuildFile")`

2 个答案:

答案 0 :(得分:1)

我添加了结束</Choose>后,我从第3行删除了.Project,因此您可能需要更改我提供的内容以正确应用于您的文件。

您永远不会更新$TestQABuildVersion,只会更新引用它的其他内容。你可能想做的是:

$Test1QAMSBuildFile = 'C:\Directory\Test.csproj'
[xml]$Test1QABuildVersion = Get-Content $Test1QAMSBuildFile
$PropertyVersion = $Test1QABuildVersion.Choose.when.PropertyGroup | ? { $_.ProductName -eq 'Test1.QA' } | Select -Expand ApplicationVersion
$UpdateVersion = $PropertyVersion.split(".")
$UpdateVersion[3] = 1+$UpdateVersion[3]
$newVersion = $UpdateVersion -join "."
$Test1QABuildVersion.Choose.when.PropertyGroup | ? { $_.ProductName -eq 'Test1.QA' } | %{$_.ApplicationVersion = $newVersion}
$TestQABuildVersion.Save($Test1QAMSBuildFile)

答案 1 :(得分:0)

以下代码将适用于您提供的示例。您需要记住的主要事情是您正在处理xml对象而不是PowerShell对象。选择要更新的节点需要使用SelectSingleNode并指定x路径。使用xml InnerText属性可以获取和设置值。下面的代码已经使用您提供的Test.csproj文件进行了测试。

$Test1QAMSBuildFile = 'C:\Directory\Test.csproj'
[xml]$Test1QABuildVersion = Get-Content $Test1QAMSBuildFile
$node = $Test1QABuildVersion.SelectSingleNode("/Choose/When/PropertyGroup/ApplicationVersion[../ProductName = 'Test1.QA']")
$PropertyVersion= $node.InnerText
$UpdateVersion= $PropertyVersion.split(".")
$UpdateVersion[3] = (($UpdateVersion[3] -as [int]) + 1).ToString()
$newVersion = $UpdateVersion -join '.'
$node.InnerText = $newVersion
$Test1QABuildVersion.Save($Test1QAMSBuildFile)

对于真正的csproj文件,您还必须处理命名空间,因为Project元素指定了命名空间。我过去对csproj文件进行了批量修改,它涉及相当多的学习曲线。