[Done]SubSection in via sub gelandender Datei nicht gefunden

Antworten
sebneu
Beiträge: 28
Registriert: 30 Sep 2013, 11:21

[Done]SubSection in via sub gelandender Datei nicht gefunden

Beitrag von sebneu »

Hallo

ich würde gerne unser subuninstall script für ein MSI Paket ändern (JAVA) - mir geht es hierbei auch ein bisschen um das Lernen (also bitte nicht antwoten nehme doch das script von...).

Die Deinstallation ist ausgegliedert in ein subpaket, sodass es vom installations- und vom deinstallationsscript aufgerufen werden kann, also über

Code: Alles auswählen

[Actions]
sub subuninstall.ins
Im subuninstall.ins habe fülle ich nun eine Stringlist mit den verschiedenen MsiIds der Java Pakete. Dies geschieht mit

Code: Alles auswählen

$MsiIds$ = addtolist($MsiIds, '{.....}')
nachdem ich nun alle MsiIds beisammen habe folgt der loop durch die MsiIds und die Aufrufe zur Deinstallation

Code: Alles auswählen

for %s% in $MsiIds$ do Sub_TestMsiID

[Winbatch_Uninstall]
$UninstallCommand$

[Sub_testMsiId]
if not (GetRegistryStringValueSysNative("[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\%s%] DisplayName") = "")
		message "MSI id %s% found in registry, starting msiexec to uninstall"
		Set $UninstallCommand$ = "msiexec /X %s% /passive REBOOT=ReallySuppress"
		Winbatch_Uninstall
endif
Mein Problem ist nun, dass das Sub testMsiIds gefunden wird, aber nicht das Sub Winbatch_Uninstall. Was mache ich falsch? Ich habe auch schon die Reihenfolge der Subs geändert - kein anderes Ergebnis. Im log steht:
Warning: The section "Winbatch_Uninstall" (called in line 4 of the calling section) does not exist or is empty
Wenn ich das Sub Winbatch_Uninstall in die Aufrufenden Datei packe, wird es auch ausgeführt.

Kann mir jemand helfen?

Besten Dank
SebNeu
Zuletzt geändert von sebneu am 05 Mai 2014, 16:41, insgesamt 1-mal geändert.
dkoch
Beiträge: 309
Registriert: 25 Nov 2011, 14:03

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von dkoch »

Mehr Log bitte.
Ich würde sagen $UninstallCommand$ ist leer denn:
Warning: The section "Winbatch_Uninstall" (called in line 4 of the calling section) does not exist or is empty
Wenn $UninstallCommand$ leer ist existiert Winbatch_Uninstall zwar ist aber leer.
Wenn du das Script von UIB als vorlage nimmst dann ist das auch das gewünschte Verhalten. Denn in diesem Fall war

Code: Alles auswählen

if not (GetRegistryStringValueSysNative("[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\%s%] DisplayName") = "")

Niemals True
sebneu
Beiträge: 28
Registriert: 30 Sep 2013, 11:21

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von sebneu »

Hallo

das ist nicht der Fall, wie man im log sehen kann:
[5] [Apr 29 12:32:10:621] If
[6] [Apr 29 12:32:10:623] Registry key [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83217055FF}] opened
[6] [Apr 29 12:32:10:625] Key closed
[5] [Apr 29 12:32:10:626] GetRegistryStringValueSysNative("[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83217055FF}] DisplayName") = "" <<< result false
[5] [Apr 29 12:32:10:628] not (GetRegistryStringValueSysNative("[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83217055FF}] DisplayName") = "") <<< result true
[5] [Apr 29 12:32:10:629] Then
[5] [Apr 29 12:32:10:662] message MSI id {26A24AE4-039D-4CA4-87B4-2F83217055FF} found in registry, starting msiexec to uninstall
[5] [Apr 29 12:32:10:665]
[5] [Apr 29 12:32:10:666] Set $UninstallCommand$ = "msiexec /X {26A24AE4-039D-4CA4-87B4-2F83217055FF} /passive REBOOT=ReallySuppress"
[6] [Apr 29 12:32:10:669] The value of the variable "$UninstallCommand$" is now: "msiexec /X {26A24AE4-039D-4CA4-87B4-2F83217055FF} /passive REBOOT=ReallySuppress"
[5] [Apr 29 12:32:10:670]
[5] [Apr 29 12:32:10:672] Warning: The section "Winbatch_Uninstall" (called in line 4 of the calling section) does not exist or is empty
[5] [Apr 29 12:32:10:673]
[4] [Apr 29 12:32:10:674] Warning: Section "Winbatch_Uninstall" does not exist or is empty
[5] [Apr 29 12:32:10:676] EndIf
Das Script springt bei der richtigen ID in den block rein und $UninstallCommand$ wird mit dem richtigen Wert gesetzt.

Besten Dank aber schon mal für die schnelle Antwort
sebneu
Benutzeravatar
Der-Matze
uib-Team
Beiträge: 102
Registriert: 16 Mär 2009, 11:00

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von Der-Matze »

Hallo SebNeu

Da haben wir anscheinend genau das selbe Konstrukt gebastelt :)
Ich stehe da vor dem gleichen Problem. Eben eine Stringliste mit msi GUIDs in einer SubUninstall.opsiscript durch eine for Schleife prügeln um die gefundenen GUIDs zu deinstallieren.
Leider ist das ein uralter Bug im Winst und wurde auch schon des öfteren im Forum behandelt:
viewtopic.php?f=6&t=5568
viewtopic.php?f=7&t=4921
viewtopic.php?f=8&t=4213

Bei der Verwendung von SubScripten sucht der Winst die Sektion in bestimmten Fällen nur im aufrufenden Script.
Das passiert unter anderem bei getOutStreamFromSection und eben bei der Verwendung von for Schleifen in einem Subscript.
Es hilft leider nur die Sektion in alle Dateien einzufügen, die das Sub-File einbinden. Das führt aber wieder zu doppeltem Code, Verwirrung und Unübersichtlichkeit.
Es wurde schon einmal angeraten die insert und append Funktionen des Winst zu benutzen. Mit dieser Lösung bin ich aber auch nicht wirklich glücklich, da ich gerne der Übersicht halber die komplette Funktionalität in ein Subscript auslagern möchte.

In der neuesten Winst testing Version sollte das Problem eigentlich behoben werden, aber leider hat ein kurzer Test bei mir nur dazu geführt dass die Sektion überhaupt nicht mehr gefunden wurde.
viewtopic.php?f=1&t=5918
Das alte Problem das in externen subsektionen die aufgerufenen Sektionen in der falschen Datei gesucht werden sollte behoben sein.
Leider hatte ich bis jetzt keine Zeit mich mit dem neuen Winst weiter zu beschäftigen.
Ich wäre an einer Lösung dieses Problems auch sehr interessiert und würde auch gerne unsere monatliche Supportvertragszeit mit in die Waagschale werfen. Leider darf ich darüber hinaus keinen weiteren Support beauftragen, sonst hätte ich schon lange ein Ticket aufgemacht. Gerne kann ich auch noch mal dem testing-winst auf den Zahn fühlen, und entsprechende Logs posten.
sebneu
Beiträge: 28
Registriert: 30 Sep 2013, 11:21

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von sebneu »

Hallo

@Der-Matze
besten Dank für Deine Ausführungen. Dann werde ich das mal weiter im Auge behalten und auf die nächste Winst warten...

Gruß
sebneu
sebneu
Beiträge: 28
Registriert: 30 Sep 2013, 11:21

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von sebneu »

Hi

ich habe gerade mal die winst 4.11.4.4 heruntergeladen und lokal ausgeführt. Der Fehler ist dort immer noch vorhanden!

Sehr schade, das muss doch irgendwie in den Griff zu bekommen sein.

Gruß
sebneu
Kathrin
Beiträge: 62
Registriert: 23 Okt 2009, 08:16

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von Kathrin »

Hallo,

ich will mich meinen Vorrednern hier anschließen. Dieser Bug macht die Skripte unübersichtlich, schwierig verständlich und verwirrend. Auch ich biete unsere monatliche Supportvertragszeit dafür an, kann/darf aber für darüber hinausgehenden Support kein Ticket aufmachen.

Vielleicht finden sich noch mehr Leute mit Supportvertrag, die dafür ihre monatlichen Freiminuten opfern und anbieten würden um das Problem in den Griff zu bekommen.


Gruß
Kathrin
Benutzeravatar
ueluekmen
uib-Team
Beiträge: 1939
Registriert: 28 Mai 2008, 10:53

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von ueluekmen »

Hallo zusammen,

wir sind dem Problem schon nachgegangen. Das Problem liegt hauptsächlich an einem Missverständnis. Die Sub-Funktionalität wurde implementiert, um Teile der primären Sektion auf zu trennen. Das hat eigentlich nur den praktischen Mehrwert, dass man für Schleifen (for über Stringlisten) Teile der primären Sektion auslagern kann. Daraus wurde dann fälschlicher Weise die Annahme, man könnte diese Auftrennung auch auf Dateien verteilen (was durch unsere Templates befeuert wurde). Daraus ergibt sich aber wiederum das Problem, welches Verhalten ist richtig. Darauf hatten wir selber auch nicht wirklich eine Antwort. Weiterhin ist diese Sub-Funktionalität tief im Parser vergraben und jede Änderung an dieser Stelle ist nicht nur kompliziert, sondern würde auch das Standard-Verhalten vom opsi-winst ändern.

Aus dieser Problemstellung sind zwei neue Funktionen im Winst enstanden:

Code: Alles auswählen

include_insert
include_append
Mit diesen beiden Funktionen ist es möglich eine Abtrennung in Dateien vor zu nehmen. include_insert wird dann verwendet, wenn man Teile der primären Sektion in eine andere Datei auslagern möchte. Mit diesem Befehl, wird der Inhalt dieser externen Datei direkt an die aktuelle Stelle eingefügt und ausgeführt. Wenn man sekundäre Sektionen auslagern möchte, dann verwendet man include_append. Mit dieser Funktion wird der Inhalt der externen Datei ans Ende des Winst-Skripts eingefügt.

Wenn man sekundäre Sektionen hat, die in mehreren Skripten aufgerufen werden sollen, schreibt man diese in eine eigene Datei und schreibt in die aufrufenden Skripte die include_append Funktion rein. Die Stelle ist egal, am besten weit oben nach der [actions] Anweisung.

Diese beiden Funktionen bringen mehr Klarheit beim schreiben der Skripte und man kann voraussehen, was passiert. Durch diese beiden neuen Funktionen und der oben beschriebenen Problematik, ist ein Umbau an der Sub-Sektions-Implementation im moment nicht geplant.
opsi support - uib gmbh
For productive opsi installations we recommend support contracts.
http://www.uib.de
sebneu
Beiträge: 28
Registriert: 30 Sep 2013, 11:21

Re: SubSection in über sub gelandender Datei wird nicht gefu

Beitrag von sebneu »

Hallo zusammen

das war ja mal ein reges Aufeinandertreffen :D

Die Funktionen

Code: Alles auswählen

include_insert 
include_append
habe ich wohl schon vorher gesehen und auch deren Sinn verstanden, erste Tests führten allerdings nicht zum gewünschten Ergebnis. Nach einem neuerlichen Versuch habe ich nun die Lösung, die ich gesucht habe. Und um ehrlich zu sein, kann ich mit der append Funktionen sogar das machen, was ich viel lieber gemacht hätte - und zwar eine Funktion direkt in einer Subdatei ausführen (ich finde das übersichtlicher). Für alle, die die gleichen Probleme hatten wie ich, füge ich hier meine Lösung an.

Die aufrufenden script Dateien (install.ins und uninstall.ins) importieren zuerst die neue subUninstall.ins über die Funktion include_append. Hier ist nun der Unterschied, dass das Script nicht in der subUninstall weiter geführt wird, sondern, dass bei meiner Lösung nur weitere Subfunktionen definiert werden. Die Einstiegsfunktion wird dann vom Hauptscript direkt aufgerufen. Also hier meine install.ins und uninstall.ins

Code: Alles auswählen

; früher : sub "%ScriptPath%\subuninstall.ins"
include_append "%ScriptPath%\subuninstall.ins"
sub_uninstall
Die subuninstall.ins sieht dann wie folgt aus:

Code: Alles auswählen

[sub_uninstall]
DefstringList $MsiIds$
DefVar $RegString$
DefVar $UninstallCommand$

; Erzeuge Liste mit alle möglichen MsiIds
set $MsiIdVersions$ = addtolist($MsiIds$, '{26A24AE4-039D-4CA4-87B4-2F83217025FF}')
set $MsiIdVersions$ = addtolist($MsiIds$, '{26A24AE4-039D-4CA4-87B4-2F83217040FF}')
set $MsiIdVersions$ = addtolist($MsiIds$, '{26A24AE4-039D-4CA4-87B4-2F83217045FF}')
set $MsiIdVersions$ = addtolist($MsiIds$, '{26A24AE4-039D-4CA4-87B4-2F83217051FF}')
set $MsiIdVersions$ = addtolist($MsiIds$, '{26A24AE4-039D-4CA4-87B4-2F83217055FF}')

' Loop durch die Liste mit call des Test, ob die MsiId in der Registry gesetzt ist
for %s% in $MsiIdVersions$ do Sub_testMsiId

[Sub_testMsiId]
Set $RegString$ =  "[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\%s%] DisplayName"

if not (GetRegistryStringValueSysNative($RegString$) = "")
		message "Deinstalliere " + $Version$
		Set $UninstallCommand$ = "msiexec /X " + $MsiId$ + " /passive REBOOT=ReallySuppress"
		Winbatch_Uninstall_msi
endif

[Winbatch_Uninstall_msi]
$UninstallCommand$
Ich hoffe, dies hilft irgendjemanden.

Gruß
sebneu
Antworten