Mehr String-Befehle für CCs

Alle Fragen rund Antworten rund um die ACMP Client Commands und Container
Antworten
Benutzeravatar
Gerundt
Beiträge: 90
Registriert: Fr Jan 10, 2020 4:42 pm

Hallo Forum,

ich bin immer noch überrascht wieviel Handarbeit es bedeutet bestimmte Sache für die Software-Verteilung auszulesen. ;)

Aktueller Fall: Die Updates von Autodesk Inventor 2019.

Wir setzen im Unternehmen auf die Konstruktionssoftware Inventor von Autodesk. Aktuell nutzen wir noch Version 2019. Die Services Packs installieren sich klassisch unter Software. Also Inventor z.B. 2019.4. Die kleinen Updates werden allerdings als MSP-Datei verteilt und werden von Windows unter Installierte Updates aufgeführt.

ACMP scheint aber nur die reinen Windows-Updates auszulesen und Drittanbieter-Updates zu ignorieren. Ich habe also aktuelle keine Möglichkeit auszulesen, ob Inventor 2019.4.0, 2019.4.1, ... installiert ist.

Will mir jetzt mit benutzerdefinierten Felder helfen und die genaue Version aus der Registry auslesen.

Autodesk speichert die Versionsnummer im Pfad HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\Inventor\RegistryVersion23.0 Die Basisversion wird unter ProductVersion (23.40.33000.0000) gespeichert und für jedes Updates wird ein Eintrag MinorVersion23* erstellt. Also Inventor 2019.4.4 erstellt z.B. den Eintrag MinorVersion23440 mit dem Wert 23.40.33000.440.

Meine Idee war, den ProductVersion-Eintrag auszulesen und die MinorVersion23*-Einträge durchzugehen und die höchste Versionsnummer am Ende zu speichern. Ich habe es am Ende auch hinbekommen, aber es war ziemliches gefrickel. :shock:

1. Problem

Warum unterstützt If ... Then kein LIKE? Da ich beim Durchlaufen der Registry keinen Filter angeben kann, muss ich in der Schleife überprüfen ob der Wertename das Format MinorVersion23* hat. Ein If Variable Like "MinorVersion23%" wäre das einfachste. Geht aber nicht. Alternative ging vielleicht auch ein String.StartsWith, was es aber nicht gibt. Kürze den Namen jetzt auf 14 stellen und mache dann einen Vergleich mit =. Irgendwie uncool. :roll:

2. Problem

Versionsnummern vergleichen. Musste mir mit VBS jetzt was bauen, was zwei Versionsnummern vergleicht. Da der Befehl If file version is Versionsnummer vergleicht müsste es intern dafür ja Quelltext geben. Mit dem Quelltext könnten man doch vielleicht eine Funktion Compare Version Strings bauen?

Wünsche

Hier noch mal meine Wünsche zusammengefasst:
  • If ... Then mit LIKE
  • Funktion String Starts With
  • Funktion String Ends With
  • Funktion Compare Version Strings
Vielleicht kann man da ja was machen. :mrgreen:
Mit freundlichen Grüßen

Tim Gerundt
IT-Administration ∙ Montanhydraulik GmbH
twahl
Beiträge: 366
Registriert: Mo Mär 03, 2014 11:21 am

Hallo,

im IF..Then Baustein kann ein in Operator genutzt werden, dieser entspricht einem like %<string>%.
Ein IF MinorVersion23 in %Version_aus_Registry% würde also ein True liefern.

Ein like %<string> oder like <string>% lässt sich damit aber nicht abbilden.
Ich habe Ihr Interesse daran im Verbesserungsvorschlag ACMP-29864 - "CC / IF: Weitere Operatoren für IF-Baustein" ergänzt.
Zusätzlich habe ich noch folgendes Ticket angelegt: ACMP-30326 - "CC / String / IF: String starts with / ends with"

Bezüglich des Versionsvergleiches müsste ich intern noch einmal klären wie das umgesetzt werden soll.
Mit freundlichen Grüßen,

Tobias Wahl
Aagon GmbH
twahl
Beiträge: 366
Registriert: Mo Mär 03, 2014 11:21 am

Hallo,

für den Versionsvergleich werden wir keinen weiteren Baustein anbieten oder bestehenden überarbeiten.

In einem Client Command kann mit einem Delphi Script Baustein ein Vergleich gemacht werden.
Hier ist ein passendes Script dazu, erwartet wird als "Eingabe" die ACMP Projektvariablen VERSION1 und VERSION2, diese können einfach mit Set Projectvariable befüllt werden.
Als Ausgabe wird die ACMP Projektvariable VERSIONCHECKRESULT befüllt, diese muss zuvor erstellt werden.
// Liefert 0 zurück wenn beide Versionen gleich sind
// Liefert 1 zurück wenn die erste Version größer ist als die Zweite
// Liefert -1 zurück wenn erste Version kleiner ist als die Zweite
uses
SysUtils, Classes;

const
C_VERSION_DELIMITER = '.';
var
LVersionString1,LVersionString2 : string;
LVersionInfo1, LVersionInfo2: TStringList;
i, LResult, L1, L2: Integer;
begin
ScriptResult := 0;

//Auslesen der Versionsinformationen aus den Variablen
LVersionString1 := GetVarContent('VERSION1');
LVersionString2 := GetVarContent('VERSION2');

LogMessage('Version1: ' + LVersionString1);
LogMessage('Version2: ' + LVersionString2);

LVersionInfo1 := TStringList.Create();
LVersionInfo2 := TStringList.Create();
try
LVersionInfo1.Delimiter := C_VERSION_DELIMITER;
LVersionInfo1.DelimitedText := LVersionString1;

LVersionInfo2.Delimiter := C_VERSION_DELIMITER;
LVersionInfo2.DelimitedText := LVersionString2;

LResult := 0;
// Überprüfe die einzelnen Versionsinformations-Blöcke
for i := 0 to LVersionInfo1.Count -1 do
begin
if not (TryStrToInt(LVersionInfo1, L1) and
TryStrToInt(LVersionInfo2, L2)) then
begin
LogMessage('Error: Version contains illegal characters');
ScriptResult := -1;
Exit;
end;
if L1 > L2 then
begin
// Version 1 ist größer als Version 2
LResult := 1;
break;
end
else
if L1 < L2 then
begin
// Version 1 ist kleiner als Version 2
LResult := -1;
break;
end;
end;
finally
LVersionInfo1.Free();
LVersionInfo2.Free();
end;
// Schreibe das Ergebnis in eine Variable
SetVarContent('VERSIONCHECKRESULT', LResult);
LogMessage('Result: ' + IntToStr(LResult));
end;
Mit freundlichen Grüßen,

Tobias Wahl
Aagon GmbH
Antworten