#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, и это требовало немалого обучения.