In einer Funktion können z.B. sich häufig wiederholende Abläufe stehen aber auch der Übersicht dienen, indem man diese Beispielsweise in einer externen UDF auslagert.
Eine Funktion wird mit Func _FUNKTIONSNAME() gestartet und mit Endfunc beendet.
Der Name der Funktion sollte eindeutig und als Funktion zu erkennen sein! (ich mache das immer mit einem _ am Anfang der Funktion)
Es lassen sich auch Parameter übergeben, um Variable Werte zu übergeben z.B. Fenstertitel, Pfade etc..
AutoIt-Quelltext
ShellExecute("notepad.exe")
_WriteToNotepad("Dieser Text wird automatisch an Notepad gesendet")
_WriteToNotepad("Dieser Text wird ebenfalls automatisch an Notepad gesendet")
Func _WriteToNotepad($sText)
WinWait("[CLASS:Notepad]")
ControlSend("[CLASS:Notepad]","","Edit1",$sText & @CR)
EndFunc
Im Beispiel wird einfach in $sText der übermittelte Wert gespeichert und abgerufen. Das funktioniert natürlich auch mit mehreren Parametern, diese müsst ihr einfach mit Kommata trennen (_funktion($sParameter1,$sParameter2)).
Mit optionalen Parametern könnt ihr nicht zwingend anzugebene Werte festlegen im Beispiel unten ist es @CR um einen Absatz am Ende der Zeile zu setzen. Diese kann aber auch durch Beispielsweise ein Semikolon beendet werden.
AutoIt-Quelltext
ShellExecute("notepad.exe")
_WriteToNotepad("Dieser Text wird automatisch an Notepad gesendet")
_WriteToNotepad("Dieser Text wird ebenfalls automatisch an Notepad gesendet",";")
Func _WriteToNotepad($sText,$sEndline = @CR)
WinWait("[CLASS:Notepad]")
ControlSend("[CLASS:Notepad]","","Edit1",$sText & $sEndline)
EndFunc
Wenn man verhindern möchte, dass ein Wert innerhalb der Funktion veränderbar ist kann man diesen mit const als Konstante markieren.
Das verhindert vor allem das versehentliche ändern einer Variable innerhalb der Funktion (z.B. ein festgelegter Pfad).
AutoIt-Quelltext
ShellExecute("notepad.exe")
_WriteToNotepad("Dieser Text wird automatisch an Notepad gesendet")
Func _WriteToNotepad(Const $sText)
$sText = "Neuer Text"
WinWait("[CLASS:Notepad]")
ControlSend("[CLASS:Notepad]", "", "Edit1", $sText)
EndFunc ;==>_WriteToNotepad
Ihr könnt ebenfalls eine variable Anzahl an Parametern übergeben indem ihr @NumParams nutz, es beinhaltet die Anzahl der Parameter die aktuell mit Inhalt gefüllt sind.
Im Beispiel sind bis zu 5 Parameter möglich wir übergeben aber nur 3 und es werden auch nur 3 bearbeitet.
AutoIt-Quelltext
ShellExecute("notepad.exe")
_WriteToNotepad("Dieser Text wird automatisch an Notepad gesendet", "Dieser auch", "Dieser ebenfalls")
Func _WriteToNotepad($sText1 = "", $sText2 = "", $sText3 = "", $sText4 = "", $sText5 = "")
Local $sText
For $i = 1 To @NumParams
WinWait("[CLASS:Notepad]")
ControlSend("[CLASS:Notepad]", "", "Edit1", Eval("sText" & $i) & @CR)
Next
EndFunc ;==>_WriteToNotepad
Funktionen geben normalerweise immer einen Ergebnis zurück, ob dieser Erfolgreich war, ader auch einen Array, String oder Ähnliches. Dies lässt sich mit Return bewerkstelligen.
AutoIt-Quelltext
MsgBox(0, "Rückgabewert", _Summe(123, 2))
Func _Summe(Const $iZahl1, Const $iZahl2)
Return $iZahl1 + $iZahl2 ;Gibt die Summe der beiden Variablen zurück
EndFunc ;==>_Summe
Um extern festzustellen, ob ein Fehler innerhalb der Funktion aufgetreten ist gibt es die Funktion Seterror damit lässt sich @error auf einen Wert setzen (-1,-2...), um das Errorhandling zu vereinfachen.
AutoIt-Quelltext
_CheckComputer("Fehler")
If @error Then
MsgBox(0, "Error", "Die Computernamen stimmen nicht überein!" & @CR & "ErrorCode: " & @error)
Else
MsgBox(0, "Erfolg", "Die Computernamen stimmen überein")
EndIf
_CheckComputer(@ComputerName)
If @error Then
MsgBox(0, "Error", "Die Computernamen stimmen nicht überein!" & @CR & "ErrorCode: " & @error)
Else
MsgBox(0, "Erfolg", "Die Computernamen stimmen überein")
EndIf
Func _CheckComputer($sComputername)
If @ComputerName = $sComputername Then
Return 1
Else
Return SetError(-1, @error, 0)
EndIf
EndFunc ;==>_CheckComputer
Ihr wisst sicher das es für AutoIt zahlreiche UDFs gibt, diese bestehen aus Funktionen, welche mit Hilfe von #include in ein Script abgerufen werden können. Ihr solltet eure UDFs immer gut beschreiben, damit ihr auch später noch den Durchblick habt . Ein nettes Tool dafür ist DesribeIt von Seubo.
AutoIt-Quelltext
;Hier zunächst die UDF WinWMI_UserAccount.au3
; #FUNCTION# ======================================================================================
; Name .............: _WinWMI_UserAccount_GetInformation()
; Description ......: Returns requested Userinformation in a 2D Array
; Syntax ...........: _WinWMI_UserAccount_GetInformation(Const[ $sFields = "Name",Const[ $sUser = "%",Const[ $sComputer = "127.0.0.1"]]])
; Parameters .......: Const $sFields - [optional] Userinformation seperated by comma (default:"Name")
; $sUser - [optional] Users seperated by comma (default:"%")
; Const $sComputer - [optional] Target Computer (default:"127.0.0.1")
; Return values ....: Success - requested Userinformation in a 2D Array
; Failure - 0 Sets @error to:
; |-1 Connection failed
; |-2 WMI Class not found/no access
; |-3 No matches found
; Author ...........: Mahagon
; Link .............: http://msdn.microsoft.com/en-us/library/aa394507(v=VS.85).aspx
; Link (German).....: http://www.scriptinternals.de/new/ger/support/Internal/WMI_Win32_UserAccount.htm
; Au3.api extension.: _WinWMI_UserAccount_GetInformation( [ "Fieldnames" [, "Username" [, "Target Computer"]]] ) Returns requested Userinformation in a 2D Array ( Requires: #include <WinWMI_UserAccount.au3> )
; =================================================================================================
Func _WinWMI_UserAccount_GetInformation(Const $sFields = "Name", $sUser = "%", Const $sComputer = "127.0.0.1")
$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sComputer & "\root\CIMV2")
If IsObj($oWMI) = 0 Then Return SetError(-1, @error, 0)
$sUser = StringReplace($sUser, ",", "' Or Name LIKE '")
$oList = $oWMI.ExecQuery("SELECT " & $sFields & " FROM Win32_UserAccount WHERE Name LIKE '" & $sUser & "'", "WQL")
If IsObj($oList) = 0 Or Not IsAdmin() Then Return SetError(-2, @error, 0)
$aFields = StringSplit($sFields, ",", 2)
If $oList.Count = 0 Then Return SetError(-3, @error, 0)
Local $aReturn[$oList.Count][UBound($aFields)]
$iCount = 0
For $oItem In $oList
With $oItem
For $iFields = 0 To UBound($aFields) - 1
Switch $aFields[$iFields]
Case "AccountType"
$aReturn[$iCount][$iFields] = .AccountType
Case "Caption"
$aReturn[$iCount][$iFields] = .Caption
Case "Description"
$aReturn[$iCount][$iFields] = .Description
Case "Disabled"
$aReturn[$iCount][$iFields] = .Disabled
Case "Domain"
$aReturn[$iCount][$iFields] = .Domain
Case "FullName"
$aReturn[$iCount][$iFields] = .FullName
Case "InstallDate"
$aReturn[$iCount][$iFields] = .InstallDate
Case "LocalAccount"
$aReturn[$iCount][$iFields] = .LocalAccount
Case "Lockout"
$aReturn[$iCount][$iFields] = .Lockout
Case "Name"
$aReturn[$iCount][$iFields] = .Name
Case "PasswordChangeable"
$aReturn[$iCount][$iFields] = .PasswordChangeable
Case "PasswordExpires"
$aReturn[$iCount][$iFields] = .PasswordExpires
Case "PasswordRequired"
$aReturn[$iCount][$iFields] = .PasswordRequired
Case "SID"
$aReturn[$iCount][$iFields] = .SID
Case "SIDType"
$aReturn[$iCount][$iFields] = .SIDType
Case "Status"
$aReturn[$iCount][$iFields] = .Status
EndSwitch
Next
EndWith
$iCount += 1
Next
Return $aReturn
EndFunc ;==>_WinWMI_UserAccount_GetInformation