Variablen von Function in andere Function übergeben?

  • Hallo,

    nachdem mir in einem anderen Thread gesagt wurde mein Script wäre etwas "unschön" und wenn ich es auf mehrere funktionen aufteile würde wäre es besser, habe ich mich gleich an die Arbeit gemacht.

    Das meiste habe ich inzwischen auch schon geändert, nur an einem Problem hänge ich im Moment :(

    ich habe eine Function die in der GUI mittels startbutton ausgeführt wird, dort wird geprüft welche Checkboxen (= Installationen) ausgewählt sind...

    Bei manchen Installation (Citrix, Outlook einrichten etc.) benötige ich jedoch 2 oder 3 Variablen die gleich nach dem Start per inputbox eingegeben werden. Gebraucht werden die Variablen aber erst später im Ablauf der Installationen.

    Soweit so gut, aber wie bekomme ich nun die Variablen in die nachfolgenden Funktionen übernommen?

    Spoiler anzeigen
    [autoit]


    Func startbutton() ; startet den Ablauf der Installationen nach Prüfung ob die Checkboxen ausgewählt wurden

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(48, "Installationsstart", "Die ausgewählten Installationen starten nun!" & @CR & @CR & "Ein Abbruch ist über STRG + ALT + X möglich!" )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If BitAND (GUICtrlRead($Checkbox5), $GUI_CHECKED) then ; Variablen mit Benutzerdaten für lokale Installation als Administrator füllen
    $Benutzer_1 = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie den Benutzernamen ein:" , "", "", 300, 100 )
    $Domaene = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie die Domäne ein:" , "", "", 300, 100 )
    sleep(1000)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If BitAND (GUICtrlRead($Checkbox5), $GUI_CHECKED) then check5() ; Benutzer lokal als Administrator einrichten (Verwendet Variablen von weiter oben!)

    [/autoit] [autoit][/autoit] [autoit]

    Endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func check5()
    If @OSVersion = "WIN_7" then
    RunWait(@ComSpec & " /c " & 'RunDll32.exe shell32.dll,Control_RunDLL nusrmgr.cpl', "", @SW_HIDE) ;Benutzerkontenverwaltung öffnen Windows 7
    WinWaitActive( "Benutzerkonten")
    send("{tab}")
    sleep(200)
    send("{tab}")
    sleep(200)
    send("{space}")
    WinWaitActive( "Benutzerkonten" , "Verwenden Sie die unten stehende Liste" )
    Send("{ALTDOWN}H{ALTUP}")
    send($Benutzer_1)
    sleep(200)
    send("{tab}")
    sleep(200)
    send($Domaene)
    sleep(200)
    send("{enter}")
    sleep(200)
    send("{down}")
    sleep(200)
    send("{enter}")
    sleep(200)
    send("{enter}")
    sleep(500)
    Send("{ALTDOWN}{F4}{ALTUP}")
    sleep(1000)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    das war mein erster versuch, funktioniert aber nicht weil er dann in der funktion check5 sagt die Variablen sind nirgends deklariert...

    Ich hab dann etwas gegoogelt und bin dann darauf gestoßen das man mit return die Variablen zurückgeben kann:

    Spoiler anzeigen
    [autoit]


    Func startbutton() ; startet den Ablauf der Installationen nach Prüfung ob die Checkboxen ausgewählt wurden
    MsgBox(48, "Installationsstart", "Die ausgewählten Installationen starten nun!" & @CR & @CR & "Ein Abbruch ist über STRG + ALT + X möglich!" )

    [/autoit] [autoit][/autoit] [autoit]

    If BitAND (GUICtrlRead($Checkbox5), $GUI_CHECKED) then check5_1()

    [/autoit] [autoit][/autoit] [autoit]

    If BitAND (GUICtrlRead($Checkbox5), $GUI_CHECKED) then check5()

    [/autoit] [autoit][/autoit] [autoit]

    Endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func check5()
    If @OSVersion = "WIN_7" then
    RunWait(@ComSpec & " /c " & 'RunDll32.exe shell32.dll,Control_RunDLL nusrmgr.cpl', "", @SW_HIDE) ;Benutzerkontenverwaltung öffnen Windows 7
    WinWaitActive( "Benutzerkonten")
    send("{tab}")
    sleep(200)
    send("{tab}")
    sleep(200)
    send("{space}")
    WinWaitActive( "Benutzerkonten" , "Verwenden Sie die unten stehende Liste" )
    Send("{ALTDOWN}H{ALTUP}")
    send($Benutzer_1)
    sleep(200)
    send("{tab}")
    sleep(200)
    send($Domaene)
    sleep(200)
    send("{enter}")
    sleep(200)
    send("{down}")
    sleep(200)
    send("{enter}")
    sleep(200)
    send("{enter}")
    sleep(500)
    Send("{ALTDOWN}{F4}{ALTUP}")
    sleep(1000)
    EndIf
    Endfunc

    [/autoit] [autoit][/autoit] [autoit]

    Func check5_1()
    $Benutzer_1 = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie den Benutzernamen ein:" , "", "", 300, 100 )
    $Domaene = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie die Domäne ein:" , "", "", 300, 100 )
    Return $Benutzer_1
    Return $Domaene
    sleep(1000)
    EndFunc

    [/autoit]

    aber damit bekomm ich damit wird der Fehler nicht wirklich anders?

    Bin ich da total falsch dran oder steh ich irgendwie auf dem Schlauch? ?(


    P.S. irgendwie wirft es mir hier beim reinkopieren ins Forum immer mal wieder die Einrückung raus, liegt das an mir oder muss man da etwas beachten?

  • im 1. oder im 2. Versuch?

    wäre das dann so richtig?

    Spoiler anzeigen
    [autoit]


    Func check5_1()
    Global $Benutzer_1 = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie den Benutzernamen ein:" , "", "", 300, 100 )
    Global $Domaene = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie die Domäne ein:" , "", "", 300, 100 )
    Return $Benutzer_1
    Return $Domaene
    sleep(1000)
    EndFunc

    [/autoit]
  • Trocken und schnell, aber bitte:

    [autoit]

    Global $testvar = 0

    [/autoit][autoit][/autoit][autoit]

    testfunc1()
    testfunc2()

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "Testbox", "$testvar = " & $testvar)

    [/autoit][autoit][/autoit][autoit]

    Func testfunc1()
    $testvar += 3
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func testfunc2()
    $testvar += 1
    EndFunc

    [/autoit]

    Eine Möglichkeit. ;)

    MfG,
    Nestos.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • in beiden, weil

    [autoit]

    return $var1
    return $var2

    [/autoit]


    bring nix, weilo nur $var1 zurückgegeben wird und nicht $var2.
    Global ist in solchen Dingen IMMER die Sichere Seite.

    In deinem jetzigen Script musst dus daher einfach so machen:

    [autoit]

    Func check5_1()
    Global $Benutzer_1 = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie den Benutzernamen ein:" , "", "", 300, 100 )
    Global $Domaene = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie die Domäne ein:" , "", "", 300, 100 )
    Return ;--> Geht zum aufruf der Funktion zurück, Dank Global kannst du die Variablen auch dort verwenden.
    sleep(1000)
    EndFunc

    [/autoit]

    mfg
    Hauke

  • Das ist ein sehr unüblicher und schlechter Programmierstil.
    Globale Variablen gehören niemals in eine Funktion, diese sollte immer am Anfang vom Skript stehen!
    Und dank deinem Return wird der Sleep-Befehl nicht ausgeführt, denn Return beendet die Funktion. Außerdem kann man auch ohne dein Return die Variablen verwenden. In deinem Fall ist es 'sinnfrei' und birgt Fehler.

    MfG,
    Nestos.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Dann mach ichs halt so ;)

    [autoit]

    Global $Benutzer_1, $Domaene
    check5_1()
    Func check5_1()
    $Benutzer_1 = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie den Benutzernamen ein:" , "", "", 300, 100 )
    $Domaene = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie die Domäne ein:" , "", "", 300, 100 )
    Return ;--> Geht zum aufruf der Funktion zurück, Dank Global kannst du die Variablen auch dort verwenden.
    EndFunc

    [/autoit]


    sollte eigentlich auch nur zeigen, was Global Variablen bringen und das es damit geht.

    mfg
    Hauke

  • @ H212

    das heisst ich kann mit deiner Variante also nur jeweils eine Variable pro Funktion (also Testfunc1, testfunc2) eingeben und zurückgeben? oder versteh ich das falsch?


    @ hauke96

    das werd ich jetzt gleich mal testen


    EDIT: super so funktionierts....der Syntax-Check vom SciTE meckert es zwar an ?( , aber funktionieren tuts...

    2 Mal editiert, zuletzt von cupra-turbo (2. Dezember 2011 um 08:36)

  • Moin,

    alternativ könntest Du auch ein Array mit zwei Werten zurückgeben lassen.


    [autoit]


    $aRückgabe = check5_1
    ConsoleWrite ($aRückgabe[0] & @CRLF)
    ConsoleWrite ($aRückgabe[1] & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Func check5_1( )
    Local $aReturn[2]
    $aReturn[0] = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie den Benutzernamen ein:" , "", "", 300, 100 )
    $aReturn[1] = InputBox ( "Benutzereinrichtung Windows", "Bitte geben Sie die Domäne ein:" , "", "", 300, 100 )
    Return $aReturn
    EndFunc

    [/autoit]


    Gruß
    Greenhorn


  • das gefällt mir auch sehr gut...

    wo genau muss der obere Teil dann platziert werden? in der Startfunction die vom Button angestoßen wird oder in der Function check_5 die dann die eigentlichen Eingaben durchführt?

    Ich würde im Moment sagen in der Startfunktion?

  • wo genau muss der obere Teil dann platziert werden? in der Startfunction die vom Button angestoßen wird oder in der Function check_5 die dann die eigentlichen Eingaben durchführt?

    Ich würde im Moment sagen in der Startfunktion?

    Habe es mir jetzt nicht ganz genau angesehen, aber grob würde ich sagen ja. ;)

    Gruß