Seite 1 von 1

For-Schleife mit Aufruf eigener Funktion mit Parameterübergabe -> Parameter illegal String?

Verfasst: 29 Jun 2017, 13:59
von IvicaE
Hallo Leute,

ich brauche wieder einmal mehr eure Unterstützung.

Ich möchte mir das Leben im OPSI-Scripten etwas einfacher machen und mehr mit Schleifen, eigenen Funktionen und Parameter arbeiten.

Ich habe ein OPSI-Paket welches mir mehrere Parameter anbietet.
Parameter 1 und 2 sind ein muss, Parameter 3-7 sind Pfadangaben zu ausführbaren Programmen. Diese muss mindestens 1 Angabe haben, kann aber bis 5 enthalten.

Die Properties für die Pfadangabe haben alle den selben Aufbau: prog1, prog2,..,prog5

So, ich würde gerne in diesem Fall eine For-Schleife erstellen welche dann eine eigene Sub aufruft und den Schleifenzähler übergibt.
In dieser 'Funktion (also die 'Sub') will ich prüfen ob ein Property gesetzt ist und wenn ja in eine String-Liste aufnehmen (global deklariert) welche ich später dann 'weiterverwenden will.

So, nun ich habe eine For-Schleife und ich habe eine eigene Sub welche ich in der Schleife aufrufe und den Schleifenzähler als Parameter übergebe.

Code: Alles auswählen

for %s% = "1" to "5" do Sub_getPropertyPathValue %s%
In der Sub selber habe ich folgendes:

Code: Alles auswählen

[Sub_getPropertyPathValue]
set $tmpVar$ = "prog_"+%1
comment $tmpVar$
Auch habe ich versucht auch nur den 1. PArameter auszugeben mit comment %1 oder auch Message %1.
Leider bekommei ch bei allen Versuchen immer ein
illegal String ExpressionStr
bzw. im konkreten Fall:
$tmpVar$ = "prog_1"+%1 -> %1 illegal String Expressionstr
Ich bin ein alter Programmierer und fühle mich in so einigen Sprachen recht wohl und zu Hause.
Aber hier stehe ich noch auf sehr wackeligen Beinen und weiß eigentlich sozusagen nichts.

Parameter an Funktionen können doch mittlerweile übergeben werden, richtig? Parameter ansprechen tut man wie in einer Batchdatei mit der Nummerierung incl. dem vorhergehenden %-Zeichen, richtig?
Winst kennt nicht wirklich Integervariablen was mir in meinem Vorhaben ja recht Wurst sein kann -> Die Zahl im Parameter müsste demnach ja bereits ein String sein. Und wenn nicht, finde ich im Handbuch leider nichts zu Umwandlungen von Zahlen zu Strings.
Wieso meckert Winst an dieser Stelle und was passt ihm hier nicht wirklich?

Nach der Lösung dieses Problemes (hoffentlich) komme ich ja zu dem Punkt das ich die Properties in dieser Sub auslesen möchte. Wird das Vorhaben so überhaupt gehen oder übesehe ich vielleicht noch was grundlegendes?

Jedenfalls schon einmal im Voraus danke für eure Hilfe oder zumindest das Lesen bis hierher ;)

Re: For-Schleife mit Aufruf eigener Funktion mit Parameterübergabe -> Parameter illegal String?

Verfasst: 03 Jul 2017, 10:03
von IvicaE
Natürlich könnte es sein, ist sogar wahrscheinlich, das ich einfach nur blöd bin, aber ich finde auch in der Winst-Anleitung nichts zu diesem Thema.

Ich finde nicht einmal die Parameterübergabe an Sub-Funktionen außer die von der Umgebung vorgesehenen PArameter wie 32 / 664 / Sysnative u.ä.

Daher meine Frage: geht das überhaupt?
Irgendwo (Internet, Forum, sonst wo) habe ich bei irgendwem gesehen daß Parameter übergeben wurden und daß man auf diese wie in der Batch-Datei (%1, %2, usw.) zugreifen kann in der Sub-Funktion.
Irre ich mich in dieser Sache?

Wenn ich mich irre:
Muss ich über eine globale Variable gehen wie auch schon in älteren Forenbeiträgen gefunden zu älteren OPSI-Versionen?

Wenn ich mich nicht irre:
Dann bekomme ich die Syntax wohl nicht wirklich hin..

Code: Alles auswählen

sub_test "Hello world"

[sub_test]
comment %1
Ergebnis: Leere Zeile zwischen 'Start Sub' und 'End Sub' in der sub_test

Mit einer globalen Variable geht das schon, aber wenn es per Parameter funktionieren würde wäre das noch besser.

Re: For-Schleife mit Aufruf eigener Funktion mit Parameterübergabe -> Parameter illegal String?

Verfasst: 18 Jul 2017, 10:08
von n.wenselowski
Hi,

es läuft im Winst ein wenig anders.
Hier definierst du deine Variablen und greifst in der Sub einfach darauf zu - eine Übergabe muss nicht stattfinden, gibt es so aktuell noch gar nicht.

Dein erstes Beispiel kannst du mal so probieren:

Code: Alles auswählen

for %s% = "1" to "5" do Sub_getPropertyPathValue

Code: Alles auswählen

[Sub_getPropertyPathValue]
set $tmpVar$ = "prog_"+%s%
comment $tmpVar$
Ich hoffe das hilft dir weiter!

Gruß

Niko

Re: For-Schleife mit Aufruf eigener Funktion mit Parameterübergabe -> Parameter illegal String?

Verfasst: 20 Jun 2025, 16:18
von malte.gerth
Hallo,

ich habe hier genau das selbe Problem.

Code: Alles auswählen

; detect the device ID by driver description
; ------------------------------------------
if ($DeviceID$ = "NONE")
    for %deviceToCheck% = "1" to "9" do Sub_set_device_id_by_driver_description
    if ($DeviceID$ = "NONE")
        isFatalError "Could not detect dynamic device ID for chipset '" + $WantedChipsetName$ + "' available"
    endif
endif

Code: Alles auswählen

[Sub_set_device_id_by_driver_description]
    Set $DeviceRegistryKey$ = "[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\000" + %deviceToCheck%
    Set $DeviceRegistryKey$ = $DeviceRegistryKey$ + "] DriverDesc"
    Set $ChipsetName$ = GetRegistryStringValue64($DeviceRegistryKey$)
    if ($ChipsetName$ = $WantedChipsetName$)
        Set $DeviceID$ = %deviceToCheck%
    endif

Code: Alles auswählen

Syntax Error in Section: Sub_set_device_id_by_driver_description (Command in line 355 in section: Sub_set_device_id_by_driver_description; file: sections.opsiinc; section start at line: 75; origin: sections.opsiinc; line: 76): $DeviceRegistryKey$ = "[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\" + 1 + "] DriverDesc" -> "1 + "] DriverDesc"" is an illegal String Expressionstr

Syntax Error found in line: >Set $DeviceRegistryKey$ = "[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\" + 1 + "] DriverDesc"<
Wenn man schaut hat der ursprüngliche Autor auch genau den selben Fall.
Es geht nicht um die Übergabe des Parameters, sondern die Fehlermeldung beim Zusammenbauen des Strings.

Re: For-Schleife mit Aufruf eigener Funktion mit Parameterübergabe -> Parameter illegal String?

Verfasst: 23 Jun 2025, 07:21
von j.schneider
Hallo,

Problem ist hierbei die String-Verknüpfung von %deviceToCheck%.
So sollte es funktionieren:

Code: Alles auswählen

[Sub_set_device_id_by_driver_description]
    Set $DeviceRegistryKey$ = "[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\000%deviceToCheck%"
    Set $DeviceRegistryKey$ = $DeviceRegistryKey$ + "] DriverDesc"
    Set $ChipsetName$ = GetRegistryStringValue64($DeviceRegistryKey$)
    if ($ChipsetName$ = $WantedChipsetName$)
        Set $DeviceID$ = "%deviceToCheck%"
    endif
Siehe:
https://docs.opsi.org/opsi-docs-de/4.3/ ... -iteration