McPoldy: Ich habe weder DLL-Call, noch eine andere Funktion dafür genutzt
Es gibt noch andere Wege ![]()
Beiträge von BugFix
-
-
Meines wissens gibt es ja keine Funktion wie isset() in php.
Es gibt ja nur zwei Zugriffsformen auf das Array:
- alle Elemente durchgehen in einer Schleife ==> da begrenzt du das durch Angabe "To Ubound($Array) -1"
- gezielt einen Index ansprechen (darauf zielt wohl dein Skript) ==> wenn du selber codest, sollten dir aber schon die existierenden Indizes bekannt sein, insofern ist auch dort eine vorherige Überprüfung nicht notwendig -
Verstehe den Sinn nicht, du prüfst ob ein Index im Bereich von UBound-1 liegt. Wozu?
-
Anpassung an 3.2.12.0 erfolgt ==> Post 1
-
So geht / und : am Ende
[autoit]$string = '-hallo w?elt: kugel'
[/autoit]
$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'
[/autoit]
$aErgebnis = StringRegExp($string, '(?<=-)[\w\säöüÄÖÜ]*',1)
MsgBox(0, '', $aErgebnis[0]) -
z.B.
[autoit]While Not ('Bedingung')
[/autoit]
; Code
WEnd
[autoit]
oder auchDo
[/autoit]
; Code
Until 'Bedingung' -
-
-
Wenn du das InputCtrl mit <ENTER> verläßt, löst das ein Event aus.
[autoit]
Du kannst also für das Input festlegen:GUICtrlSetOnEvent($Input, 'InputChanged')
[/autoit]
; ...
Func InputChanged()
; Code
EndFunc -
Habs nicht getestet, aber folgende Hinweise:
[autoit]
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:
[/autoit]
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:
[autoit]
Wenn das "If-Statement" nur eine Anweisung enthält - einfach in eine Zeile schreiben ohne EndIF
StattIf FileExists('Options.ini') = 0 Then
[/autoit]
FileInstall('Options.ini', 'Options.ini')
EndIfbesser
[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.Spoiler anzeigen
[autoit]Dim $fault1 = GUICtrlCreateCheckbox("1. " & $G1, 50, 330, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault1 = GUICtrlCreateInput("", 200, 330, 225, 20)Dim $fault2 = GUICtrlCreateCheckbox("2. " & $G2, 50, 355, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault2 = GUICtrlCreateInput("", 200, 355, 225, 20)Dim $fault3 = GUICtrlCreateCheckbox("3. " & $G3, 50, 380, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault3 = GUICtrlCreateInput("", 200, 380, 225, 20)Dim $fault4 = GUICtrlCreateCheckbox("4. " & $G4, 50, 405, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault4 = GUICtrlCreateInput("", 200, 405, 225, 20)Dim $fault5 = GUICtrlCreateCheckbox("5. " & $G5, 50, 430, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault5 = GUICtrlCreateInput("", 200, 430, 225, 20)Dim $fault6 = GUICtrlCreateCheckbox("6. " & $G6, 50, 455, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault6 = GUICtrlCreateInput("", 200, 455, 225, 20)Dim $fault7 = GUICtrlCreateCheckbox("7. " & $G7, 50, 480, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault7 = GUICtrlCreateInput("", 200, 480, 225, 20)Dim $fault8 = GUICtrlCreateCheckbox("8. " & $G8, 50, 505, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault8 = GUICtrlCreateInput("", 200, 505, 225, 20)Dim $fault9 = GUICtrlCreateCheckbox("9. " & $G9, 50, 530, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault9 = GUICtrlCreateInput("", 200, 530, 225, 20)Dim $fault10 = GUICtrlCreateCheckbox("10. " & $G10, 50, 555, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault10 = GUICtrlCreateInput("", 200, 555, 225, 20)Dim $fault11 = GUICtrlCreateCheckbox("99. " & $G11, 50, 580, 150, 17)
[/autoit] [autoit][/autoit] [autoit]
Dim $input_fault11 = GUICtrlCreateInput("", 200, 580, 225, 20); verkürzte Variante:
[/autoit]
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)
NextIn 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 = ''
[/autoit][autoit][/autoit][autoit]
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\microsoft\homenet")
$colItems = $objWMIService.ExecQuery("Select * from HNet_Connection")For $objItem In $colItems
[/autoit]
$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.
[autoit]
Dann sieht eine Zeile so aus:$zeile = "Name" & @TAB & "Stichwort" & @TAB & "Beschreibung"
[/autoit]
[autoit]
Beim Auslesen kannst du dann die Daten wieder vereinzeln mit$ArrayZeile = StringSplit($zeile, @TAB)
[/autoit]