Fehler mit lokalen Variablen in lokalen Funktionen
Verfasst: 23 Mär 2018, 18:44
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:
Fehler 1
Mit der im Beispiel auskommentierten Funktion identity scheitert der Aufruf der drauffolgenden Funktion removePath.
Die Fehlermeldung (verkürzt):
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:
Ein kurzer Test unter Linux mit opsi-script_4.12.0.14 zeigte dagegen mit dem Beispielskript das erwartete Verhalten.
Viele Grüsse,
Jens
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$)
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
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: ""
Viele Grüsse,
Jens