So geht / und : am Ende
[autoit]$string = '-hallo w?elt: kugel'
$aErgebnis = StringRegExp($string, '(?<=-)(.*)(?:(/|\:))',1)
MsgBox(0, '', $aErgebnis[0])
So geht / und : am Ende
[autoit]$string = '-hallo w?elt: kugel'
$aErgebnis = StringRegExp($string, '(?<=-)(.*)(?:(/|\:))',1)
MsgBox(0, '', $aErgebnis[0])
Wie bereits von peethebee erwähnt: In For-Schleifen können in AutoIt keine Bedingungen implementiert werden.
Es gibt mehrere Varianten. Wenn vorn immer ein "-" ist und ab "/" abgeschnitten werden soll, ist folgendes allgemeingültig:
[autoit]$string = '-hallo welt/ kugel'
$aErgebnis = StringRegExp($string, '(?<=-)[\w\säöüÄÖÜ]*',1)
MsgBox(0, '', $aErgebnis[0])
z.B.
[autoit]While Not ('Bedingung')
; Code
WEnd
oder auch
Do
; Code
Until 'Bedingung'
Wenn du das InputCtrl mit <ENTER> verläßt, löst das ein Event aus.
Du kannst also für das Input festlegen:
GUICtrlSetOnEvent($Input, 'InputChanged')
; ...
Func InputChanged()
; Code
EndFunc
Habs nicht getestet, aber folgende Hinweise:
Im Funktionskopf bitte das Array als: ByRef $Array angeben. Somit wird auf das Originalarray (im Speicher) zugegriffen. Anderenfalls wird eine Arbeitskopie angelegt (Performanceverlust).
Folgendes kannst du auch vereinfachen:
; statt:
If Not IsArray($Array) Then
SetError(0)
Return
EndIf
; besser:
If Not IsArray($Array) Then Return SetError(0)
Das ContinueLoop-Statement musste ich setzten da mir das Script sonst alle Case-Fälle nacheinander abgearbeitet hat obwohl ich nur einen Button angeklickt habe. Ich werde es aber nochmals ohne versuchen.
Ja, du hast recht. In diesem Fall hast du ja eine Folge von IF-Statements, die du so übergehen kannst. Wenn du statt der IF's, "Select-Case" verwendest, hast du denselben Effekt aber ohne ContinueLoop ![]()
Edit:
Achja, wegen Arrays... schau mal in meine Signatur
*Zaunpfahl-schwenk* ![]()
Sieht gut aus. Ein paar Tipps:
Wenn das "If-Statement" nur eine Anweisung enthält - einfach in eine Zeile schreiben ohne EndIF
Statt
If FileExists('Options.ini') = 0 Then
FileInstall('Options.ini', 'Options.ini')
EndIf
besser
[autoit]If FileExists('Options.ini') = 0 Then FileInstall('Options.ini', 'Options.ini')
[/autoit]Mehrere Controls in gleichem Abstand erstellen geht besser in einer Schleife. Die ID's dann in einem Array auffangen.
Hier mal das Original von dir und im Vergleich die Schleifenvariante.
Dim $fault1 = GUICtrlCreateCheckbox("1. " & $G1, 50, 330, 150, 17)
Dim $input_fault1 = GUICtrlCreateInput("", 200, 330, 225, 20)
Dim $fault2 = GUICtrlCreateCheckbox("2. " & $G2, 50, 355, 150, 17)
Dim $input_fault2 = GUICtrlCreateInput("", 200, 355, 225, 20)
Dim $fault3 = GUICtrlCreateCheckbox("3. " & $G3, 50, 380, 150, 17)
Dim $input_fault3 = GUICtrlCreateInput("", 200, 380, 225, 20)
Dim $fault4 = GUICtrlCreateCheckbox("4. " & $G4, 50, 405, 150, 17)
Dim $input_fault4 = GUICtrlCreateInput("", 200, 405, 225, 20)
Dim $fault5 = GUICtrlCreateCheckbox("5. " & $G5, 50, 430, 150, 17)
Dim $input_fault5 = GUICtrlCreateInput("", 200, 430, 225, 20)
Dim $fault6 = GUICtrlCreateCheckbox("6. " & $G6, 50, 455, 150, 17)
Dim $input_fault6 = GUICtrlCreateInput("", 200, 455, 225, 20)
Dim $fault7 = GUICtrlCreateCheckbox("7. " & $G7, 50, 480, 150, 17)
Dim $input_fault7 = GUICtrlCreateInput("", 200, 480, 225, 20)
Dim $fault8 = GUICtrlCreateCheckbox("8. " & $G8, 50, 505, 150, 17)
Dim $input_fault8 = GUICtrlCreateInput("", 200, 505, 225, 20)
Dim $fault9 = GUICtrlCreateCheckbox("9. " & $G9, 50, 530, 150, 17)
Dim $input_fault9 = GUICtrlCreateInput("", 200, 530, 225, 20)
Dim $fault10 = GUICtrlCreateCheckbox("10. " & $G10, 50, 555, 150, 17)
Dim $input_fault10 = GUICtrlCreateInput("", 200, 555, 225, 20)
Dim $fault11 = GUICtrlCreateCheckbox("99. " & $G11, 50, 580, 150, 17)
Dim $input_fault11 = GUICtrlCreateInput("", 200, 580, 225, 20)
; verkürzte Variante:
Dim $y = 305, $arCB[11], $arIn[11], $num
For $i = 0 To UBound($arCB) -1
$y += 25
If $i < UBound($arCB) -1 Then
$num = $i+1
Else
$num = 99
EndIf
$arCB[$i] = GUICtrlCreateCheckbox($num & ". " & Eval("G" & $i+1), 50, $y, 150, 17)
$arIn[$i] = GUICtrlCreateInput("", 200, $y, 225, 20)
Next
In deinen Case-Statements (While-Schleife ab Zeile 320) verwendest du überall "ContinueLoop". Allerdings kann ich nicht den Bezug zur Schleife erkennen.
Die Anwendung von "ContinueLoop" dient im Allgemeinen dazu, einen Anweisungsblock zu überspringen und mit dem folgenden Schleifenelement fortzufahren. Du bist jedoch in einer Endlosschleife, die auf GUI-Events wartet. Das "ContinueLoop" bringt somit keinen Nutzen (auch wenn es nicht schadet
).
Also weiter so ![]()
Auch von mir ein: Hallo und Herzlich Willkommen.
ich dachte nämlich das beim öffnen der .txt automatisch auch die calc.exe gestartet wird.
Das habe ich getestet (die zweite Variante, direkt in die Datei einbetten). Zumindest von der Komandozeile klappte das.
Der Aufruf sollte natürlich möglichst vor allen anderen erfolgen. Sonst ist zu leicht lokalisierbar, wo er her kommt und dann kann man im abgesicherten Modus doch wieder alles ändern.
Aber das geht mir jetzt schon ein wenig zu sehr in die Tiefe. Ich denke Anregungen sind genug da. Alles weiter sollte jeder für sich klären. Denn wenn das hier noch vertieft wird, ist die Gefahr des Mißbrauchs sicher hoch. Und hier war ja eigentlich Sicherheit das Anliegen.
Also, ich habs grad mal getestet. Geht super.
Für Euch zum Testen, Taschenrechner an Textdatei anhängen:
1. Erstellt eine beliebige Textdatei (der Einfachheit halber direkt in C:\), z.B. TestADS.txt
2. Öffnen cmd.exe
3. Befehlseingabe: type C:\Windows\system32\calc.exe > C:\TestADS.txt:calc2.exe
4. Funktionstest, Eingabe auf Cmdline: C:\TestADS.txt - Die Textdatei wird geöffnet
5. start C:\TestADS.txt:calc2.exe - Und siehe da: Der Taschenrechner startet!
Um den Aufruf nicht offensichtlich zu machen kann er über einen Registry-Aufruf versteckt werden.
Edit:
Ich habe gerade eine nichtdokumentierte Variante gefunden, damit wird der ADS allerdings nicht angehängt, sondern in die Ursprungsdatei "eingebettet". Somit funktioniert die TXT-Datei genauso, wie eine EXE! ( Allerdings ist die Textdatei als solche unbrauchbar
)
So gehts:
1. Verknüpfen
type C:\Windows\system32\calc.exe > C:\TestADS.txt
2. Ausführen
C:\TestADS.txt
Das ist natürlich für einen versteckten Aufruf ideal. Man kann z.B. "mslogo.jpg" verwenden um dort das Skript einzubauen. Der Aufruf des Logos ist sicher absolut unverfänglich. Dadrüber wird dein Bruder wohl nicht stolpern ;-).
Schau dir mal die Bsp. in der Hilfe zu _IEFormSubmit() an. Das erklärt eigentlich alles.
Suchst du sowas?
[autoit]$out = ''
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\microsoft\homenet")
$colItems = $objWMIService.ExecQuery("Select * from HNet_Connection")
For $objItem In $colItems
$out &= "GUID: " & $objItem.GUID & @LF
$out &= "Is LAN Connection: " & $objItem.IsLANConnection & @LF
$out &= "Name: " & $objItem.Name & @LF
$out &= "Phone Book Path: " & $objItem.PhoneBookPath & @LF & @LF
Next
ConsoleWrite($out & @CRLF)
Edit:
Zur Konfiguration von Netzwerkadaptern hatte ich auch mal was erstellt: Link
Wenn du die Daten in eine Textdatei schreibst, am Besten alle Daten eines Datensatzes in eine Zeile. Als Trennzeichen zwischen den einzelnen Feldern mußt du etwas wählen, was nicht im Text vorkommen kann. Vermutlich wäre hier Tabulator (also @TAB) geeignet.
Dann sieht eine Zeile so aus:
$zeile = "Name" & @TAB & "Stichwort" & @TAB & "Beschreibung"
[/autoit]
Beim Auslesen kannst du dann die Daten wieder vereinzeln mit
$ArrayZeile = StringSplit($zeile, @TAB)
[/autoit]
schöne Sache.
Am Besten, gleich mal in eine Funktion packen ![]()
;=====================================================
; $Swap 0 = normale Maus, 1 = Maustasten getauscht
;=====================================================
Func _MouseSwap($Swap=0)
If $Swap <> 0 Then $Swap = 1
Local $dll = DllOpen("user32")
DllCall($dll,"int","SwapMouseButton","int",$Swap)
DllClose($dll)
EndFunc
Hi,
stimme da McPoldy zu. Wenn du Zugriff auf die Datenbank hast, reicht doch eine sortierte Abfrage und das gewünschte Ergebnis liegt vor.
So etwa:
"SELECT team,points,diff FROM table ORDER BY points DESC, diff DESC"
Solltest du keinen Zugriff auf die Datenbank haben, dann halt eine Lösung mit Array. Auch wenn Oscar wegen der Einfachheit mit mehreren 1D-Array arbeitet ;), bessere Übersicht und einfachere (vor allem mehrstufige) Sortierung geht mit einem 2D-Array.
$array[n][3] ; [n][0]=TEAM, [n][1]=PUNKTE, [n][2]=DIFF
Das ganze mehrstufig sortieren (ArrayMore.au3) und fertig.
OK, du bist noch nicht lange dabei. Sonst wüßtest du, dass hier ein jeder mal in irgendeiner Weise so einen Spruch reinbekommt ( ich auch
).
Und das ist durchaus nur als kleiner Scherz gemeint.
In erster Linie wirst du hier qualifizierte Antworten bekommen - aber manchmal... da reitet einen halt der Teufel. ![]()
Nimm nicht alles so bierernst. ![]()
Auch von mir ein Herzliches Willkommen "Du Jungspund" ![]()