Не удалось обновить значение в файле msbuild proj с помощью powershell

#powershell #msbuild

#powershell #msbuild

Вопрос:

Я пытаюсь прочитать файл .csproj с помощью powershell, преобразовав его в XML-файл, чтобы увеличить значение версии приложения WPF. Я могу прочитать значение без каких-либо проблем и увеличить значение версии, но когда я пытаюсь сохранить файл с новым значением, значение не сохраняется. Код, который я вставил в этот вопрос, предназначен для обновления сведений о контроле качества.

Я пытаюсь прочитать приведенный ниже файл. Как мне обновить и сохранить файл

 <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:DirectoryTest.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")`
  

Ответ №1:

После того, как я добавил закрывающее, </Choose> я удалил .Project из строки 3, поэтому вам, возможно, потребуется изменить то, что я даю вам, чтобы правильно применить к вашему файлу.

Вы никогда не обновляли $TestQABuildVersion , только некоторые другие вещи, которые ссылались на это. Что вы, вероятно, хотите сделать, это:

 $Test1QAMSBuildFile = 'C:DirectoryTest.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. Большое спасибо, это помогло мне решить проблему. У меня недостаточно баллов для голосования:(

Ответ №2:

Ниже приведен код, который будет работать в приведенном вами примере. Главное, что вам нужно иметь в виду, это то, что вы имеете дело с объектом xml, а не с объектом powershell. Для выбора узла, подлежащего обновлению, требуется использовать SelectSingleNode и указать x-path. Использование свойства xml innerText позволяет получить и установить значение. Приведенный ниже код был протестирован с помощью предоставленного вами файла Test.csproj.

 $Test1QAMSBuildFile = 'C:DirectoryTest.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, и это требовало немалого обучения.