Hallo AutoIt'ler!
Nachdem ich selbst immer wieder kleine Tools benötige die als "Dos-Programm" laufen sollen/müssen und meistens auch noch mit Parameter zu steuern sind, habe ich mir keine kleine Funktion geschrieben die übergeben Argrumente auswertet.
Im Gunde ist das nicht anders als eine Erleichterung für den Programmier um seine erwarteten Eingaben überprüfen zu lassen.
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
local $optionen = "su" ;welche Parameter es geben soll; u=username s=system; Reihenfolge im Rückarray so wie die Optionen
;(von links nach rechts) eingetragen werden. Beispiel:
;Index 1 = /u
;Index 2 = /s
;Egal in welcher Reihenfolge die Parameter übergeben worden sind
local $parametersymbol = "/" ;Wie Parameter gekennzeichnet wird
$ret = _Parameter ($cmdline, $parametersymbol, $optionen) ;Parameterauswertung
if IsArray ($ret) = 1 Then ;Wird ein Array zurückgegeben = OK
for $i = 1 to UBound($ret) - 1
print ("Index " & $i & @tab & $ret[$i])
Next
Else
if $ret = 1 then ;Help ist ausgewertet worden
print ("Parameter: /u:username /s:system")
print ("")
print ("Fehlermeldungen:")
print ("-1 ... Anzahl der uebergebenen und gesuchten Parameter stimmt nicht ueberein")
print ("-2 ... mindestens eine Uebergabeparameter-Kennung nicht gefunden z.B.: /c")
print ("-3 ... Der erste Parameter muss ein Array sein")
print ("-4 ... Array hat keinen Werte")
print ("-5 ... Der Delimiters darf nur aus einem Zeichen bestehen")
print ("-6 ... Die Parametersuche muss mindestens ein Zeichen beinhalten")
Else
print ("Error: " & $ret) ;Wird KEIN Array und kein 1 zurückgegeben sondern einen Errorwert = Fehler
EndIf
EndIf
;********************************************************************************************
; Parameterauswertung Übergaben aus der Console ($cmdline)
; Übergabe: Array der Parameter $Cmdline
; Übergabe: Parametersymbol z.B.: / oder -
; Übergabe: Nach welchen Parametersymbolen gesucht werden soll als String "uprw"
;
; Achtung: Wird ein Fehler gefunden wird KEIN Array zurückgegeben!!!!
; Variable mit IsArray überprüfen
;
; Rückgabe: Array mit den Daten - Index beginnt bei 0
; Rückgabe: -1 ... Anzahl der übergebenen und gesuchten Parameter stimmt nicht überein
; Rückgabe: -2 ... mindestens eine Übergabeparameter-Kennung nicht gefunden z.B.: /c
; Rückgabe: -3 ... Der erste Parameter muss ein Array sein
; Rückgabe: -4 ... Array hat keinen Werte
; Rückgabe: -5 ... Der delimiters darf nur aus einem Zeichen bestehen
; Rückgabe: -6 ... Die Parametersuche muss mindestens ein Zeichen beinhalten
; Rückgabe: 1 .... Für Helpanzeige
;
; Beispiel:
; local $optionen = "upr" ;welche Parameter es geben soll
; local $parametersymbol = "/" ;Wie Parameter gekenntzeichnet wird
; $ret = _Parameter ($cmdline, $parametersymbol, $optionen) ;Parameterauswertung
; if IsArray ($ret) = 1 Then ;Wird ein Array zurückgegeben = OK
; RunAswait ($ret[1], @ComputerName, $ret[2], 1, $ret[3])
; Else
; print ("Errorlevel: " & $ret) ;Wird KEIN Array zurückgegeben sondern einen Errorwert = Fehler
; exit ($ret)
; EndIf
;********************************************************************************************
func _Parameter ($cmd , $teiler, $opt_suche)
if IsArray ($cmd) = 0 Then
Return (-3)
EndIf
if stringlen ($teiler) <> 1 Then
Return (-5)
EndIf
if stringlen ($opt_suche) = 0 Then
Return (-6)
EndIf
local $line
local $i, $o, $ret, $tmp, $a ;diverse Variablen für die Verabeitung in der Funktion
local $parateil
local $teiler_anzahl ;wieviele Parameterteiler gibtes ?
local $opt_char ;das einzelne Zeichen von der $opt_suche
local $micro_para_teiler = ":" ;das ist der Teiler zwischen der Kennung und dem Parameter selbst z.B: ein Doppelpunkt /u:username
local $full_data
local $check = False ;check ob es das Zeichen auch gibt
dim $opt_w[ubound($cmd)]
if $cmd[0] <> 0 then ;Nur wenn auch Parameter übergeben worden sind
for $i= 1 to ubound($cmd) -1 ;Die einzelen Parameterübergaben zu einem String umwandeln
$line = $line & $cmd[$i] & " "
Next
$line = StringStripWS ($line, 3) ;führende und nachkommende Leerstellen entfernen
$teiler_anzahl = cntvar ($line, $teiler) ;wieviele Parameterteiler gibt es
if $line = $teiler & "?" Then ;Prüfen ob ein Help angeforder worden ist...
Return 1 ;1 als Help Kennzeichnung zurück gegen
EndIf
if $teiler_anzahl <> stringlen ($opt_suche) Then ;Stimmt die Anzahl der Commandparameter nicht gesuchten überein -> Error
Return (-1)
EndIf
dim $opt_w[$teiler_anzahl + 1]
for $o = 1 to $teiler_anzahl ;Schleife für die übergebenen Parameter
$opt_char = StringLower(StringMid ($opt_suche, $o, 1)) ;das einzelne Zeichen von der $opt_suche (nur Kleinbuchstabe)
$check = false ;Check zurücksetzten
for $i = 2 to $teiler_anzahl + 1 ;vor dem ersten Teiler gibt es nichts => beginnt mit 2 und hört mit +1 auf
$parateil = gettok ($line, $teiler , $i) ;einzelner Parameter mit Kennung
if gettok ($parateil, $micro_para_teiler, 1) = $opt_char Then
$check = True ;Teiler triff zu = OK
$a = 1 ;Dieser Schritt ist notwendig da beim Trennzeichen zwischen Parameterkennung und den
$tmp = "" ;eigentlichen Daten das Zeichen nochmal vorkommen könnte!
Do
$a = $a + 1
if gettok ($parateil, $micro_para_teiler, $a) <> "" then
$tmp = $tmp & StringStripWS(gettok ($parateil, $micro_para_teiler, $a), 3) & $micro_para_teiler
EndIf
until gettok ($parateil, $micro_para_teiler, $a) = ""
$opt_w[$o] = StringLeft ($tmp, StringLen ($tmp) -1) ;Als letztes Zeichen wird ein $micro_para_teiler angehängt => entfernen
EndIf
Next
if $check = False Then ;Wenn ein Übergabeparameterkennung z.B.: /u nicht gefunden wird => Error
Return (-2)
EndIf
Next
$opt_w[0] = ubound ($opt_w)
return ($opt_w) ;Rückgabe als Array
endif
return (-4) ;Array ist leer
EndFunc
;********************************************************************************************
;**********************************************
; Wie oft gibt es den String im String
; Übergabe: der zu druchsuchende String
; Übergabe: der zu suchende String
; Rückgabe: Trefferanzahl
;**********************************************
func cntvar ($string, $suche)
local $a , $da, $summe, $start, $do
if $string = "" or $suche = "" then
return false
endif
$start = 1
$summe = 0
do
$do = StringInStr ($string, $suche, 0, 1, $start)
if $do <> 0 then
$summe = $summe + 1
$start = $do + 1
endif
until $do = 0
return ($summe)
endfunc
;**********************************************
;**********************************************
; Tokentrenner ohne Array !!
; Übergabe: Der String der untesucht wird
; Übergabe: Der String der den ersten String teilt
; Übergabe: Das wievielte Teil
; Ausgabe: Den gesuchten Token oder eine Leerstring (=Fehler)
;**********************************************
func gettok ($string, $teiler, $teilnummer)
local $neu , $tmp
$tmp = stringsplit ($string, $teiler, 1)
if $tmp[0] >= $teilnummer then
$neu = $tmp[$teilnummer]
else
$neu = ""
endif
return $neu
endfunc
;**********************************************
;*******************************************************
Func print ($text)
ConsoleWrite ($text & @crlf)
EndFunc
;*******************************************************
Alles anzeigen
Bevor mich jetzt einige steinigen: Ja, ich weiß da sind kleine Funktionen dabei die man so nicht unbedingt braucht (Print, GetTok,...) - man verzeihe mir - ich komme von einer anderen Scriptsprache und habe die paar "Befehle" sehr lieb gewonnen
Zur Funktion:
Es muss im Hauptprogramm die Variablen $optionen und $parametersymbol definiert werden. Die Optionen geben an welche Küzel für die Parameter verwendet werden: /s oder /u oder /k ....
Die Variable $parametersymbol gibt die Markierung an, also das "/". Es kann auch sein das man lieber ein "-" hat oder "*" - ganz nach Geschmack!
Wenn alles OK ist steht im Array $ret die Ergebnisse. Ansonsten ist $ret kein Array und hat "nur" eine Fehlernummer
Ich habe viele Bemerkungen in das Script geschieben, so das es (hoffentlich) für alle Nachvollziehbar ist.
Beispiele aus dem Dos-Fenster:
Feedback ist gewünscht!
lg
Racer