Hallo Zusammen,
ich probiere gerade beim Build Automatisch die Version für eine Dacpac Datei zusetzen.
Das auslesen des Konaten aus der *.sqlproj funktioniert. Das setzen der neuen Versionsnummer nicht.
Jemand eine Ahnung voran es liegen kann.
Hier der Code:
[xml]$fileContent = Get-Content($file)
Write-Host $fileContent.DocumentElement
[string]$oldVersion = $fileContent.Project.PropertyGroup.DacVersion
[string]$newVersion = $oldVersion -replace $versionPattern , $replacePattern
Write-Host "Pattern $replacePattern"
Write-Host "Alte Version $oldVersion"
Write-Host "Neue Version $newVersion"
Write-Host $fileContent.Project.PropertyGroup.DacVersion
$fileContent.Project.PropertyGroup.DacVersion = $newVersion //Hier kommt der Fehler
Write-Host $fileContent.Project.PropertyGroup.DacVersion
$fileContent.Save($file)
Write-Host "$file Version geändert."
Und hier die Ausgabe:
Fehlermeldung:
Pattern $1.$2.$3.2379
Alte Version 1.0.0.1
Neue Version 1.0.0.23791.0.0.1
Fehlermeldung:
Die Eigenschaft "DacVersion" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die Eigenschaft vorhanden ist und festgelegt werden kann.In E:\Agent_work\4\s\SetDatabaseVersion.ps1:33 Zeichen:8
$fileContent.Project.PropertyGroup.DacVersion = [string]$newVersion> Fehlermeldung:
+ FullyQualifiedErrorId : PropertyAssignmentException> Fehlermeldung:1.0.0.1
Sollte man mal gelesen haben:
$fileContent.Project.PropertyGroup
hat keine Eigenschaft mit dem Namen DacVersion
Das sagt der Fehler aus.
Wieso nimmst Du nicht aus PowerShell heraus die .NET Funktionalitäten?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Fehlermeldung:
... und festgelegt werden kann.
Anscheinend gibt es keinen Setter für diese Eigenschaft.
@Abt: das Lesen scheint ja zu funktionieren.
@abt In der Zeile davor kann ich aber auf die Eigenschaft zugreifen und bekomme auch den Richtigen Wert zurück.
Nun das hier waren grundlegend die ersten Ergebnisse die ich bei Googel zu "Powershell XML Update" gefunden habe. Und der Zugriff so ist je eigentlich recht simpel. Wenn er nur Funktionieren würde 🙁
@Th69 Da geht auch meine Vermutung hin. Mir ist nur nicht klar wie ich es ändern kann, es ist der Wert eines Kontens in einem XML Document. Eigentlich sollte es mit dem Schreiben klappen.
Sollte man mal gelesen haben:
Ah, jetzt seh ichs auch 😉
Vermutlich wirst Du mit DacVersion.Value
oder DacVersion.'#text'
arbeiten müssen.
$fileContent.Project.PropertyGroup.DacVersion.'#text' = "$newVersion"
DacVersion ist - so wie ich das sehe - eine XmlNode. Dass Du [string] verwenden kannst liegt am impliziten ToString, das da vermutlich ausgeführt wird, das Dir die Value zurück gibt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Mit Value hatte ich es schon probiert. Mit Text Probiere ich es mal Morgen auf der Arbeit.
Danke schon mal für die Antwort.
Sollte man mal gelesen haben:
Mit '#text"' hat es jetzt auch nicht Funktioniert.
Hier noch mal ein Link von dem ich das eigentliche Vorgehen habe.
Powershell functions to get an xml node, and get and set an xml element’s value, even when the element does not already exist
Sollte man mal gelesen haben:
Hi Palin,
Hier noch mal ein Link von dem ich das eigentliche Vorgehen habe.
Dort steht aber auch:
...until you try and read or write to an element that doesn’t exist. If the <version> element is not in the xml, when I try and read from it or write to it, I get an error such as “Error: Property ‘version’ cannot be found on this object. Make sure that it exists.”.
Und es wird die Lösung vorgeschlagen, die Abt auch schon vorgeschlagen hat, nämlich auf die .NET-Klassen im System.Xml-Namespace zurückzugreifen.
Hast du das schon ausprobiert?
Weeks of programming can save you hours of planning
until you try and read or write to an element that doesn’t exist
Das Element Existiert ja, sonst könnte ich ja auch nicht lesend darauf zugreifen. Das mit der .NET-Klasse ist ein "Workaround" um die Exception zu umgehen.
Mit den .NET-Klassen hab ich es jetzt noch nicht Probiert.
Aktuell hab ich ein Tokenizer PlugIn für den TFS gefunden, was eigentlich genau das machen sollte. Mal schauen ob das Funktioniert.
Sollte man mal gelesen haben:
Der Zugriff ist eigentlich relativ simpel.
Nachdem in der XML-Struktur das Element "PropertyGroup" öfters vorkommt (default, debug, release), musst du hier nur das richtige Element selektieren.
$path = "C:\temp\aaa.sqlproj"
$content=[xml](Get-Content $path)
$propGroup = $content.Project.PropertyGroup[0]
$propGroup.DacVersion = "123"
#fertig
Die Ermittlung der richtigen PropertyGroup musst du halt noch sauber machen, aber grundlegend funktionierts so 😃 .
@alta Danke für die Antwort. 👍
Eine Kollege hat mitlerweile an andere Lösung gefunden. (Poste ich hier noch). Dein Werde ich bei gelegenheit mal ausprobieren.
MFG
Palin
Sollte man mal gelesen haben:
Hier die Lösung.
Das Skript aus dem Beitrag
Versioning your SQL Server Database using Team Build and Release Management funktioniert bei uns.
Es fehlt nur die Funktion Set-XmlElementsTextValue die ist in diesen Beitrag zu finden.
Sollte man mal gelesen haben: