UDF mit unterschiedlicher Anzahl Parameter

  • Hallo,

    nachdem mich peethebee gestern in der Shoutbox schon auf das @NumParams Makro aufmerksam gemacht hat stehe ich trotzdem noch vor einem Problem und brauche wahrscheinlich wieder nen kleinen Denkanstoß.

    Ich habe eine UDF, die mir aus .ini Dateien gewisse Daten auslesen soll. Das funktioniert auch ohne Probleme. Allerdings will ich diese Funktion auf 2 verschiedenen Weisen in einem Skript aufrufen können. Und zwar einmal innerhalb einer Schleife, dann soll die UDF keine Parameter enthalten und sich nacheinander die Informationen aus allen ini Dateien ziehen die in einem Verzeichnis liegen, und einmal mit einem Parameter und er soll sich die Information nur aus der .ini Datei ziehen, die ich ihm als Argument mitgebe.

    Funktion:

    Spoiler anzeigen
    [autoit]


    Func getComputerFacts($ComputerToGetFacts)
    #cs ----------------------------------------------------------------------------

    Beschreibung: Liest IP, Namen, Adminlogin, Passwort und .vmx Pfad des
    aktuellen Rechners aus der entsprechenden .ini Datei
    Author: André Fenner
    Parameter: keine, oder den Computernamen (muss mit dem Namen der ini Datei übereinstimmen)
    Rückgabe: keine
    Aufrufbeispiel: getComputerFacts()
    getComputerFacts("Server2003")

    #ce ----------------------------------------------------------------------------

    TrayTip("", "Aktuelle Computerinfos auslesen...", 2)

    If @NumParams = 0 Then
    $ActualComputerIP[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "ip", "Kein solcher Eintrag")
    $ActualComputerName[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "pcname", "Kein solcher Eintrag")
    $ActualComputerAdmin[$j] = IniRead($IniDirectory & $IniFile[$j], "logon", "adminid", "Kein solcher Eintrag")
    $ActualComputerPass[$j] = _StringEncrypt(0, IniRead($IniDirectory & $IniFile[$j], "logon", "adminpw", "Kein solcher Eintrag"), "Passwortverschlüsselung", 2)
    $ActualComputerVmxPath[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "vmxpath", "Kein solcher Eintrag")
    ElseIf @NumParams = 1 Then
    If FileExists($IniDirectory & $ComputerToGetFacts) Then
    $ActualComputerIP = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "ip", "Kein solcher Eintrag")
    $ActualComputerName = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "pcname", "Kein solcher Eintrag")
    $ActualComputerAdmin = IniRead($IniDirectory & $ComputerToGetFacts, "logon", "adminid", "Kein solcher Eintrag")
    $ActualComputerPass = _StringEncrypt(0, IniRead($IniDirectory & $ComputerToGetFacts, "logon", "adminpw", "Kein solcher Eintrag"), "Passwortverschlüsselung", 2)
    $ActualComputerVmxPath = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "vmxpath", "Kein solcher Eintrag")
    Else
    writeErrorLog($IniDirectory & $ComputerToGetFacts & " ist nicht vorhanden")
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Wenn ich aber nun die Funktion im Skript mittels

    [autoit]


    For $j = 1 To $i - 2 ; $i zieh ich mir woanders her
    getComputerFacts()
    Next

    [/autoit]

    aufrufe, sagt er mir (logischerweise), dass die Funktion mit der falschen Anzahl der Argumente aufgerufen wurde.

    Könnte mir jemand nen Denkanstoß geben, wie ich das Problem lösen kann?

    Danke im Voraus, smoo


    PS: Mir ist gerade ein Fehler hier im Forum aufgefallen: Wenn man AutoIt-Code mit "Einrückungen" (siehe meinen Code oben) hat, und dann die Vorschau Funktion nutzt, wird der Code nur noch linksbündig wieder im Editor eingefügt.

    Edit BugFix: Das liegt daran, dass du deine Beiträge im 'Editor'-Register schreibst - nutze besser das 'Quellcode'-Register.

    3 Mal editiert, zuletzt von smoochy (23. Mai 2008 um 15:07)

    • Offizieller Beitrag

    Hi,

    das Macro ist da unnötig.

    Spoiler anzeigen
    [autoit]

    Func getComputerFacts($ComputerToGetFacts = 0)
    #cs ----------------------------------------------------------------------------

    Beschreibung: Liest IP, Namen, Adminlogin, Passwort und .vmx Pfad des
    aktuellen Rechners aus der entsprechenden .ini Datei
    Author: André Fenner
    Parameter: keine, oder den Computernamen (muss mit dem Namen der ini Datei übereinstimmen)
    Rückgabe: keine
    Aufrufbeispiel: getComputerFacts()
    getComputerFacts("Server2003")

    #ce ----------------------------------------------------------------------------

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

    TrayTip("", "Aktuelle Computerinfos auslesen...", 2)

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

    If $ComputerToGetFacts = 0 Then
    $ActualComputerIP[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "ip", "Kein solcher Eintrag")
    $ActualComputerName[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "pcname", "Kein solcher Eintrag")
    $ActualComputerAdmin[$j] = IniRead($IniDirectory & $IniFile[$j], "logon", "adminid", "Kein solcher Eintrag")
    $ActualComputerPass[$j] = _StringEncrypt(0, IniRead($IniDirectory & $IniFile[$j], "logon", "adminpw", "Kein solcher Eintrag"), "Passwortverschlüsselung", 2)
    $ActualComputerVmxPath[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "vmxpath", "Kein solcher Eintrag")
    ElseIf Then
    If FileExists($IniDirectory & $ComputerToGetFacts) Then
    $ActualComputerIP = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "ip", "Kein solcher Eintrag")
    $ActualComputerName = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "pcname", "Kein solcher Eintrag")
    $ActualComputerAdmin = IniRead($IniDirectory & $ComputerToGetFacts, "logon", "adminid", "Kein solcher Eintrag")
    $ActualComputerPass = _StringEncrypt(0, IniRead($IniDirectory & $ComputerToGetFacts, "logon", "adminpw", "Kein solcher Eintrag"), "Passwortverschlüsselung", 2)
    $ActualComputerVmxPath = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "vmxpath", "Kein solcher Eintrag")
    Else
    writeErrorLog($IniDirectory & $ComputerToGetFacts & " ist nicht vorhanden")
    EndIf
    EndIf
    EndFunc ;==>getComputerFacts

    [/autoit]

    Mega

  • Hallo Mega,

    danke für den Tip. Ich habe nun allerdings das Problem, dass ich den Wert von $ComputerToGetFacts auch außerhalb der UDF weiterverwenden muss. Wenn ich mir den Wert der Variable innerhalb der Funktion anzeigen lasse, stimmt er, lasse ich mir den Wert außerhalb der Funktion anzeigen:

    [autoit]


    getComputerFacts("Server2k3Client.ini")
    MsgBox(1, "", $ComputerToGetFacts)

    [/autoit]

    wird mir nur ein leerer String zurückgegeben. Selbst ein Return $ComputerToGetFacts innerhalb der Funktion nutzt nichts.

    *ratlos ist*

    mfg, smoo

    PS: Danke Bugfix für den Hinweis mit dem Quellcode-Register

  • Hallo Mega,

    nach bisschen Rumtesten bin ich nun auf eine Variante gestoßen die funktioniert.

    Spoiler anzeigen
    [autoit]


    Func getComputerFacts($IniName = 0)
    #cs ----------------------------------------------------------------------------

    Beschreibung: Liest IP, Namen, Adminlogin, Passwort und .vmx Pfad des
    aktuellen Rechners aus der entsprechenden .ini Datei
    Author: André Fenner
    Parameter: keine, oder den Namen der .ini Datei
    Rückgabe: keine
    Aufrufbeispiel: getComputerFacts()
    getComputerFacts("Server2003.ini")

    #ce ----------------------------------------------------------------------------

    TrayTip("", "Aktuelle Computerinfos auslesen...", 2)
    $ComputerToGetFacts = $IniName

    If Not $ComputerToGetFacts Then
    $ActualComputerIP[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "ip", "Kein solcher Eintrag")
    $ActualComputerName[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "pcname", "Kein solcher Eintrag")
    $ActualComputerAdmin[$j] = IniRead($IniDirectory & $IniFile[$j], "logon", "adminid", "Kein solcher Eintrag")
    $ActualComputerPass[$j] = _StringEncrypt(0, IniRead($IniDirectory & $IniFile[$j], "logon", "adminpw", "Kein solcher Eintrag"), "Passwortverschlüsslung", 2)
    $ActualComputerVmxPath[$j] = IniRead($IniDirectory & $IniFile[$j], "identity", "vmxpath", "Kein solcher Eintrag")
    Else
    If FileExists($IniDirectory & $ComputerToGetFacts) Then
    $ActualComputerIP = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "ip", "Kein solcher Eintrag")
    $ActualComputerName = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "pcname", "Kein solcher Eintrag")
    $ActualComputerAdmin = IniRead($IniDirectory & $ComputerToGetFacts, "logon", "adminid", "Kein solcher Eintrag")
    $ActualComputerPass = _StringEncrypt(0, IniRead($IniDirectory & $ComputerToGetFacts, "logon", "adminpw", "Kein solcher Eintrag"), "Passwortverschlüsslung", 2)
    $ActualComputerVmxPath = IniRead($IniDirectory & $ComputerToGetFacts, "identity", "vmxpath", "Kein solcher Eintrag")
    Else
    writeErrorLog($IniDirectory & $ComputerToGetFacts & " ist nicht vorhanden")
    Exit
    EndIf
    EndIf
    EndFunc

    [/autoit]

    In weiteren UDFs kann ich dann ebenfalls abfragen, ob $ComputerToGetFacts existiert oder nicht und dementsprechend reagieren.

    Spoiler anzeigen
    [autoit]


    Func doDebug()
    #cs ----------------------------------------------------------------------------

    Beschreibung: Gibt die Daten des aktuellen Rechners aus
    Author: André Fenner
    Parameter: keine
    Rückgabe: keine
    Aufrufbeispiel: doDebug()

    #ce ----------------------------------------------------------------------------
    If Not $ComputerToGetFacts Then
    MsgBox(1, "", "IP: " & $ActualComputerIP[$j] & @CRLF & "Name: " & $ActualComputerName[$j] & @CRLF & "Admin: " & $ActualComputerAdmin[$j] & @CRLF & "Passwort: " & $ActualComputerPass[$j] & @CRLF & "VmxPfad: " & $ActualComputerVmxPath[$j])
    Else
    MsgBox(1, "", "IP: " & $ActualComputerIP & @CRLF & "Name: " & $ActualComputerName & @CRLF & "Admin: " & $ActualComputerAdmin & @CRLF & "Passwort: " & $ActualComputerPass & @CRLF & "VmxPfad: " & $ActualComputerVmxPath)
    EndIf
    EndFunc

    [/autoit]

    Danke und schönes Wochenende.

  • Hallo Mega,

    das habe ich schon so in der Art gelöst. Ich habe eine große functions.au3 in der ich alle meine Funktionen gesammelt habe, und dann hab ich ne andere .au3, in der ich diese dann aufrufe.

    Spoiler anzeigen
    [autoit]


    #include "functions.au3"

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

    If $cmdline[0] = 0 Then
    doTests()
    getAmountOfComputers()
    While Not checkForRunningVM() = 0
    doShutDownVm2($VmStatus)
    WEnd ; While Not checkForRunningVM() = 0
    For $j = 1 To $i - 2
    getComputerFacts()
    If IsValidIniFile() = 1 Then
    If VmIsRegistered() = 0 Then
    doRegisterVM()
    EndIf ; If VmIsRegistered() = 0 Then
    doStartVM()
    While checkIfVmIsBooted() = 0
    Sleep(5000)
    WEnd ; While checkIfVmIsBooted() = 0
    doPrepareClient()
    doShutDownVm()
    EndIf
    Next
    EndIf ; If $cmdline[0] = 0 Then

    [/autoit]

    mfg, smoo