Fehler mit lokalen Variablen in lokalen Funktionen

Antworten
Benutzeravatar
jub
Beiträge: 58
Registriert: 25 Nov 2010, 12:40

Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von jub »

In einem aktuellen Paket sollen lokale Funktionen zu Einsatz kommen, was bei einer Funktion noch problemlos mit opsi-winst_4.12.0.13 funktioniert hat. Schwierigkeiten haben sich dann aber ab der zweiten Funktion gezeigt.

Beipsiel-Skript:

Code: Alles auswählen

[actions]
setLogLevel=7
defVar $path$
defVar $java_home$

;-------------------------------------------------------------------------
;DefFunc identity(val $ident$:string) : string
;-------------------------------------------------------------------------
;	set $result$ = $ident$
;EndFunc

;-------------------------------------------------------------------------
DefFunc removePath(ref $fullPaths$:string, ref $pathToRemove$:string): string
;-------------------------------------------------------------------------
	DefVar $logLvl$
	DefStringList $pathList$
	set $logLvl$=getLoglevel
	setLogLevel=0
	Set $pathList$ = splitString($fullPaths$, ";")
	Set $pathList$ = removeFromListByMatch($pathToRemove$,$pathList$)
	Set $pathList$ = removeFromListByMatch("", $pathList$)
	Set $result$ = composeString($pathList$, ";")
	setLogLevel=$logLvl$
EndFunc

;-------------------------------------------------------------------------
DefFunc addPath(ref $fullPaths$:string, ref $pathToAdd$:string): string
;-------------------------------------------------------------------------
	DefVar $logLvl$
	DefStringList $pathList$
	set $logLvl$=getLoglevel
	setLogLevel=6
	DefVar $found$
	Set $pathList$ = splitString($fullPaths$, ";")
	Set $pathList$ = removeFromListByMatch("", $pathList$)
	set $found$="false"
	; for %p% in $pathList$ do sub_compare_path
	if ($found$ = "true")
		comment "Path already contains [" + $pathToAdd$ + "]"
		set $result$ = $path$
	else
		comment "Appending to path: [" + $pathToAdd$ + "]"
		Set $pathList$ = addToList($pathList$, $pathToAdd$)
		Set $result$ = composeString($pathList$, ";")
	endif
	setLogLevel=$logLvl$
	
	[sub_compare_path]
	if ("%p%" = $pathToAdd$)
		set $found$ = "true"
	endif
EndFunc

;----------
; MAIN
;----------
Set $path$ = EnvVar("PATH")
Set $java_home$ = "C:\Applic.64\javavm\bin"
Set $path$ = removePath($path$, $java_home$)
Set $path$ = addPath($path$, $java_home$)
Fehler 1
Mit der im Beispiel auskommentierten Funktion identity scheitert der Aufruf der drauffolgenden Funktion removePath.
Die Fehlermeldung (verkürzt):

Code: Alles auswählen

[6] [Mrz 23 16:38:07:796] Set  $path$ = removePath($path$, $java_home$)
[7] [Mrz 23 16:38:07:798] 
[7] [Mrz 23 16:38:07:800] (created string list $pathList$)
[6] [Mrz 23 16:38:07:804] Set  $logLvl$=getLoglevel
[6] [Mrz 23 16:38:07:807]   The value of the variable "$logLvl$" is now: "7"
[6] [Mrz 23 16:38:07:810] LogLevel was 7
[2] [Mrz 23 16:38:07:813] Syntax Error in Section:  (Command in line 6 origin: C:\tmp\winst_snippet_3.opsiscript line: 7): $pathList$ = splitString($fullPaths$, ";") -> $fullPaths$, ";") illegal String Expressionstr
Macht man die Funktion identity verfügbar, funktioniert der Aufruf von removePath. Dann wiederum würde der Aufruf von identity zu einem Fehler führen.
Es scheint also, als liesse sich die erste definiert Funktion nicht ohne Fehler aufrufen.

Fehler 2
Mit der nicht verwendeten identity-Funktion als "Opfer" lassen sich also removePath und addPath verwenden.
Hier wird nun jedoch die doppelt vorhandene lokale Variable $logLvl$ zum Stolperstein:

Code: Alles auswählen

[6] [Mrz 23 16:36:47:646] Set  $path$ = addPath($path$, $java_home$)
[2] [Mrz 23 16:36:47:649] Syntax Error in Section:  (Command in line 2 origin: C:\tmp\winst_snippet_3.opsiscript line: 3): $logLvl$ -> name is already in use
[6] [Mrz 23 16:36:47:651]   The value of the variable "$path$" is now: ""
Ein kurzer Test unter Linux mit opsi-script_4.12.0.14 zeigte dagegen mit dem Beispielskript das erwartete Verhalten.


Viele Grüsse,
Jens
Benutzeravatar
d.oertel
uib-Team
Beiträge: 3319
Registriert: 04 Jun 2008, 14:27

Re: Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von d.oertel »

Hi,

ich kann hier keinen Fehler nachvollziehen.

Wenn es mit der Version 4.12.0.15 noch ein Problem gibt,
dann bitte das (die) kompletten Testscripte per mail an mich d.oertel(at)uib.de.

Danke
detlef oertel
opsi support - uib gmbh

For productive opsi installations we recommend support contracts.
http://www.uib.de
http://www.opsi.org
Benutzeravatar
jub
Beiträge: 58
Registriert: 25 Nov 2010, 12:40

Re: Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von jub »

Der Fehler lässt sich auch mit der (Test-)Version 4.12.0.15 erzeugen. Allerdings scheint das Problem nur bei der interaktiven Nutzung des opsi-winst aufzutreten. Hierfür ist das obige Script ausreichend.

Exakt reproduzieren konnte ich den Fehler jedoch noch nicht. Ursache scheint ein vorangegangener Fehlerzustand vom opsi-winst zu sein, der auf ein zuvor ausgeführtes Script zurückzuführen ist. (Welcher Art die Fehler bei den Test waren kann ich leider nicht mehr nachvollziehen.) Bei den Tests habe ich den winst32 bzw. winst64 nicht beendet, so hat womöglich ein interner Zustand Auswirkungen auf die nachfolgend ausgeführten Scripte.
Nach einem Neustart des opsi-winst läuft obiges Script unverändert fehlerfrei durch.

Viele Grüsse,
Jens
larsg
Beiträge: 283
Registriert: 16 Dez 2014, 18:06

Re: Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von larsg »

Kann ich bestätigen, auch mit 4.12.0.15 soeben bei mir wieder aufgetreten, Fehler "Unknown variable name: $Result$"
Obwohl das Skript unverändert vorher und auch nach einem Neustart von WInst wieder problemlos funktioniert.
Benutzeravatar
d.oertel
uib-Team
Beiträge: 3319
Registriert: 04 Jun 2008, 14:27

Re: Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von d.oertel »

Hallo allerseits,

ich arbeite gerade an der Version 4.12.0.16.
Es ist offensichtlich, das beim Neustart eines Scriptes in den Vergangenen Versionen einige Variablen nicht ordentlich initialisiert wurden. Ich habe mich da um Verbesserung bemüht.

Ich habe aber leider immer noch keinen Test-Case.
Also wenn jemand Steps-to-reproduce hat - her damit !

Danke
d.oertel
opsi support - uib gmbh

For productive opsi installations we recommend support contracts.
http://www.uib.de
http://www.opsi.org
larsg
Beiträge: 283
Registriert: 16 Dez 2014, 18:06

Re: Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von larsg »

Step-by-step wie bereits beschrieben:

* Beliebiges Skript mit Funktion mit Rückgabewert (Bspw. das obige Skript oder mein Skript wie hier angegeben viewtopic.php?f=7&t=10056&p=44629#p44629) in WInst interaktiv laden
* Skript ausführen/verändern, zunächst funktioniert alles
* Durch eine mir unbekannte Ursache wird wärend der Laufzeit des WInst die lokale Variable $Result$ irgendwann unverfügbar, was dann mit einer entsprechenden Fehlermeldung quittiert wird. Eine Änderung am Skript selbst ist in meinem Fall bislang definitiv nicht die Ursache.
* Nach einem Neustart des Winst funktioniert das Skript wieder.
Benutzeravatar
d.oertel
uib-Team
Beiträge: 3319
Registriert: 04 Jun 2008, 14:27

Re: Fehler mit lokalen Variablen in lokalen Funktionen

Beitrag von d.oertel »

Hallo allerseits,

Funktioniert es mit dem ?:
https://download.uib.de/opsi4.0/experim ... .17-1.opsi
die Doku ist hier:
https://download.uib.de/opsi4.0/experim ... ual-de.pdf
Beispiele finden sich im allg. Test und Beispielprodukt:
https://download.uib.de/opsi4.0/experim ... .17-1.opsi

Code: Alles auswählen

changelog:
=============================
opsi-winst/opsi-script (4.12.0.17) stable; urgency=low

  * osparser: processcall: log Executing on LLNotice
  * new unit osparserhelper in common (Skip / getword /  ...)
  * osdefinedfunctions: int new local string vars
  * osdefinedfunctions: isVisibleLocalVar check for empty varname
  * osparser: catch powershellCall at Linux
  * OsDefinedFunction.parseCallParameter: fix handling parameters with ')'

-- Detlef Oertel <d.oertel@uib.de>  Fri, 13 Apr 2018:15:00:00 +0200

opsi-script-test (4.12.0.16-1) stable; urgency=low

  * ExecWith_powershell: added trap { write-output $_ ; exit 1 }
  * ExecWith_powershell: added exit $LASTEXITCODE
  * fuction with no parameters
  * fuction with no (void) result
  * using isConfidential to test:
    ** SetConfidential
    ** asConfidential
    ** splitStringOnWhiteSpace
    ** splitString
  * asConfidential
  * upper(<str>)
  * lower(str)
  * RegKeyExists
  * RegVarExists
  * %opsiapplog%
  * %opsidata%
  * getIndexFromListByContaining
  * new function : getSubListByMatch(<search string>, <target list>) :stringlist
  * new function : getSubListByMatch(<search list>, <target list>) :stringlist
  * new function : getSubListByContaining(<search string>, <target list>) :stringlist
  * new function : getSubListByContaining(<search list>, <target list>) :stringlist
  * new function : getSubListByKey(<search string>, <target list>) :stringlist
  * new function : getSubListByKey(<search list>, <target list>) :stringlist
  * new function : getKeyList(<list>) :stringlist
  * getregistryvalue(<keystr>, <varstr> [, <access str>]) : string
  * powershellCall

-- detlef oertel <d.oertel@uib.de>  Tue,  27 Mar 2018 15:00:00 +0200

=============================
gruß
d.oertel
opsi support - uib gmbh

For productive opsi installations we recommend support contracts.
http://www.uib.de
http://www.opsi.org
Antworten