1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • Problem mit FileCopy (hilfe)

    • misterspeed
    • 28. März 2013 um 13:33

    Dann hast du entweder keine Schreibrechte im Zielverzeichnis oder die Quelldatei ist exklusiv gesperrt (z.B. weil sie noch in einem anderen Programm im Schreibmodus geöffnet ist). Alternativ könnte es natürlich auch sein, dass die Quelldatei nicht existiert (schreibweise prüfen?)

  • Problem mit FileCopy (hilfe)

    • misterspeed
    • 28. März 2013 um 13:18

    Der Zielpfad muss mit einem "\" enden, außerdem sollte das Flag 8 verwendet werden wenn der Zielordner noch nicht existiert, sofern ein Überschreiben einer bereits vorhandenen Kopie erwünscht ist verwende Flag 1 oder eine Kombination aus beiden Falgs. (8+1, also 9)

  • Auswahl nach Datum und Datei Typ, im Windows Datei Auswahl Dialog

    • misterspeed
    • 28. März 2013 um 11:35

    Und warum willste das so umständlich über den fileopendialog von libreoffice machen? Ich habe zwar nur ms office, aber so ziemlich jedes Programm unterstützt den Aufruf mit Parametern um Dateien zu öffnen. Das hier sollte also genauso und vorallem zuverlässiger funktionieren:


    Spoiler anzeigen
    [autoit]


    #include <file.au3>

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

    global $libreoffice = "c:\programme....\libreoffice\word.exe" ; frei erfunden, den pfad musst selbst wissen
    global $ordner = @ScriptDir & "\" ; verzeichnis mit deinen Dateien

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

    HotKeySet("{MEDIA_PLAY_PAUSE}", "openLastFile")
    HotKeySet("{ESC}","_exit")

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

    While 1
    Sleep (100)
    WEnd

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

    Func openLastFile()
    Local $file = getLastFile($ordner)
    If $file = -1 Then
    msgbox(0,"Fehler","Keine Dateien im Verzeichnis " & $ordner & " gefunden!")
    Else
    ConsoleWrite('"' & $libreoffice & '" "' & $file & '"' & @CRLF) ; debug
    ;Run('"' & $libreoffice & '" "' & $file & '"') ; musste noch einkommentieren, wenn der Pfad zu libreoffice passt...
    EndIf
    EndFunc

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

    func getLastFile($folder)
    local $aTemp = _filelisttoarray($folder,"*.txt",1) ; hier Dateiendung anpassen, falls es doch keine txt Dateien sind
    Local $newestCreationTime = 0
    Local $lastFile

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

    If $aTemp = 0 Then return -1

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

    for $i = 1 to $aTemp[0]
    $curCreationTime = FileGetTime($aTemp[$i],1,1) ; Erstelldatum in Stringform, siehe Hilfe wenn stattdessen das Änderungsdatum genutzt werden soll
    ConsoleWrite($curCreationTime & @CRLF); debug
    If $curCreationTime > $newestCreationTime Then
    ConsoleWrite("neuere Datei gefunden: " & $curCreationTime & " --> " & $newestCreationTime & " (" & $aTemp[$i] & ")" & @CRLF); debug
    $newestCreationTime = $curCreationTime
    $lastFile = $aTemp[$i]
    EndIf
    next

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

    return $folder & $lastFile

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

    endfunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Autenthifizierungsfenster abfangen und füllen

    • misterspeed
    • 27. März 2013 um 11:13

    Tjo scheinbar hast du in diesem Fall wirklich ein Problem. Tkchild windows können anscheinend nicht wie die meisten Fenster über die genannten Funktionen automatisiert werden, zumindestens findet man über google jedemenge Beiträge und gescheiterte Versuche dazu. Also sofern niemand eine Idee hat wie man es doch hinbekommt bleibt meiner Meinung nach dann nur noch die unzuverlässigere Variante mit send / click, so wie du es ursprünglich hattest.

    Zu deinem Sonderzeichenproblem solltest du dir die Hilfe des send() Befehls anschauen, dort ist dokumentiert, welche Zeichen maskiert werden müssen. Das gespeicherte PW muss also zunächst von dir geparsed und in einen kompatiblen String formatiert werden.

    So funktioniert es mit dem Sonderzeichen "#"

    [autoit]


    run("notepad.exe")
    Sleep(500)
    send("meinPWmitSonderzeichen{#}")

    [/autoit]

    Automatisiert könntest du den String so erzeugen:

    [autoit]


    $meinPW = "meinPWmitSonderzeichen#"
    $meinPW = StringReplace($meinPW,"#","{#}")
    ConsoleWrite($meinPW & @CRLF)

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

    run("notepad.exe")
    Sleep(500)
    send($meinPW)

    [/autoit]

    Da mehr als nur ein Zeichen davon betroffen ist solltest du das PW grundsätzlich durch eine Funktion zur Ersetzung aller problematischen Zeichen jagen.

    Beispiel:

    [autoit]


    $meinPW = "meinPWmitSonderzeichen#"
    ConsoleWrite($meinPW & @CRLF)
    $meinPW = replaceSendChars($meinPW)
    ConsoleWrite($meinPW & @CRLF)

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

    run("notepad.exe")
    Sleep(500)
    send($meinPW)

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

    Func replaceSendChars($string)
    ; unvollständig, siehe Hilfe von send()
    Local $aReplaceRules[3][2] = [ ["!","{!}"], _
    ["#","{#}"], _
    ["+","{+}"] _
    ]
    For $i=0 To UBound($aReplaceRules)-1
    $string = StringReplace($string,$aReplaceRules[$i][0],$aReplaceRules[$i][1])
    Next

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

    Return $string
    EndFunc

    [/autoit]
  • Schnelleres als MouseClicks ?

    • misterspeed
    • 26. März 2013 um 14:59

    Und wenn es eine Excel Tabelle ist gibt es auch noch die Excel UDF, siehe google oder Forensuche. ;)

  • Schnellere Filterung einer ListView + Zuordung

    • misterspeed
    • 26. März 2013 um 14:48

    Hier mal ein Beispiel. Allerdings ist das so natürlich noch fehlerhaft, es macht aber auch keinen Sinn da weiter dran zu basteln solange du keine Angaben dazu machst wie die Filter voneinander abhängig und kombinierbar sind und vorallem wären Beispieldaten notwendig um das ganze zu optimieren. Grundsätzlich funktioniert das Script so wie es ist nur wenn man zuerst das Dropdown nutzt und danach dieses vorgefilterte Array über die Inputfelder durchsucht. In meinem eigentlichen Script verwende ich ausschließlich voneinander abhängige Dropdowns zum Filtern, da ist es sehr viel leichter das so wie unten gezeigt zu realisieren. Bei freien Eingabefeldern dürfte es kaum möglich sein effektiv mit vorgefilterten Arrays weiterzuarbeiten. Man müsste auf jedenfall noch einiges ändern, damit die Suche korrekte Ergebnisse liefert, das habe ich z.B. durch den Wechsel aufs ungefilterte Array angedeutet, wenn etwas im Dropdown geändert wird. Besonders schnell ist es bei 50k Zeilen allerdings auch nicht, den Geschwindigkeitsvorteil bemerkt man erst wenn man das ganze durch das Dropdown massivst dezimiert hat. Nunja vielleicht hilfts dir trotzdem und vielleicht ist es ja schneller als das was du derzeit verwendest. Ich habe gottseidank nur an die 3k Zeilen und 8 Spalten, da ist die Performance noch ausreichend.

    Anmerkung:

    Die csv-datei muss so aufgebaut sein:

    Code
    überschrift1,....,überschrift6
    datenspalte1zeile1,.....,datenspalte6zeile1
    ...

    Alternativ wird ein 2D Array mit den Test Daten benötigt.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <file.au3>
    #include <array.au3>
    #include <GuiListView.au3>

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

    Global $aUnfilteredData[1][6]
    Global $aFilteredData[1][6]
    Global $fileData = @ScriptDir & "\exampleData.txt"
    readCSVToArray($fileData,$aUnfilteredData)

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

    Global $curFilter1 = ""
    Global $curFilter2 = ""
    Global $curFilter3 = ""
    Global $curFilter4 = "alle"
    Global $found = "?"
    ;_ArrayDisplay($aUnfilteredData)

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

    Global $gMain = GUICreate("FastListViewFilter", 1034, 707, 192, 124)
    Global $lwData = GUICtrlCreateListView("||||||", 32, 176, 969, 505)
    Global $chkFilter1 = GUICtrlCreateCheckbox("Filter1", 32, 51, 97, 17)
    Global $chkFilter2 = GUICtrlCreateCheckbox("Filter2", 32, 90, 97, 17)
    Global $chkFilter3 = GUICtrlCreateCheckbox("Filter3", 32, 128, 97, 17)
    Global $inpFilter1 = GUICtrlCreateInput("", 168, 47, 129, 21)
    Global $inpFilter2 = GUICtrlCreateInput("", 168, 86, 129, 21)
    Global $inpFilter3 = GUICtrlCreateInput("", 168, 124, 129, 21)
    Global $lblFound = GUICtrlCreateLabel($found,496,95,80,20)
    Global $btnSearch = GUICtrlCreateButton("suche",496,120, 100, 30)
    Global $cbFilter4 = GUICtrlCreateCombo("", 496, 40, 249, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))

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

    GUICtrlSetData($cbFilter4,"alle|rot|grün|blau","alle")
    fillListview($lwData,$aUnfilteredData)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $cbFilter4, $btnSearch
    filterListview($lwData,$aFilteredData)
    EndSwitch
    If UBound($aFilteredData)-1 <> $found Then
    $found = UBound($aFilteredData)-1
    GUICtrlSetData($lblFound,$found)
    EndIf
    WEnd

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

    Func readCSVToArray($file,ByRef $aData)
    Local $aTemp, $aSplit
    _FileReadToArray($file,$aTemp)
    ReDim $aData[$aTemp[0]][6]
    For $i=1 to $aTemp[0]
    $aSplit = StringSplit($aTemp[$i],",")
    For $j=1 to $aSplit[0]
    $aData[$i-1][$j-1]=$aSplit[$j]
    Next
    Next
    EndFunc

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

    Func fillListview(ByRef $lwID,ByRef $aData)
    _GUICtrlListView_BeginUpdate($lwID)
    GUICtrlDelete($lwID)
    _GUICtrlListView_EndUpdate($lwID)

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

    $lwID = GUICtrlCreateListView("||||||", 32, 176, 969, 505)

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

    _GUICtrlListView_BeginUpdate($lwID)
    GUICtrlSetData($lwData,$aData[0][0] & "|" & $aData[0][1] & "|" & $aData[0][2] & "|" & $aData[0][3] & "|" & $aData[0][4] & "|" & $aData[0][5])
    For $i=1 to UBound($aData)-1
    GUICtrlCreateListViewItem($aData[$i][0] & "|" & $aData[$i][1] & "|" & $aData[$i][2] & "|" & $aData[$i][3] & "|" & $aData[$i][4] & "|" & $aData[$i][5],$lwID)
    Next

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

    For $i=0 to 5
    _GUICtrlListView_SetColumnWidth($lwID, $i , 150)
    Next
    $aFilteredData = $aData
    _GUICtrlListView_EndUpdate($lwID)

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

    EndFunc

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

    Func filterListview(ByRef $lwID, ByRef $aCurrent)
    Local $aNew[ubound($aCurrent)][UBound($aCurrent,2)]

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

    $filter1 = GUICtrlRead($inpFilter1)
    $filter2 = GUICtrlRead($inpFilter2)
    $filter3 = GUICtrlRead($inpFilter3)
    $filter4 = GUICtrlRead($cbFilter4)
    If $filter4 <> $curFilter4 Then
    $curFilter4 = $filter4
    filterListview($lwID,$aUnfilteredData)
    Return
    EndIf

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

    $k=1
    For $i=1 to UBound($aCurrent)-1
    if $filter4 <> "alle" Then
    if $aCurrent[$i][4]<> $filter4 Then ContinueLoop
    EndIf
    If $filter1 <> "" Then
    If not StringInStr($aCurrent[$i][1],$filter1) then ContinueLoop
    EndIf
    If $filter2 <> "" Then
    If not StringInStr($aCurrent[$i][2],$filter2) then ContinueLoop
    EndIf
    If $filter3 <> "" Then
    If not StringInStr($aCurrent[$i][3],$filter3) then ContinueLoop
    EndIf
    For $j = 0 to UBound($aCurrent,2)-1
    $aNew[$k][$j] = $aCurrent[$i][$j]
    Next
    $k+=1
    Next
    For $i = 0 to UBound($aCurrent,2)-1
    $aNew[0][$i] = $aCurrent[0][$i]
    Next
    redim $aNew[$k+1][UBound($aCurrent,2)]
    fillListview($lwID,$aNew)
    EndFunc

    [/autoit]
  • Ping blockiert bzw. ist zu langsam

    • misterspeed
    • 26. März 2013 um 11:21

    Dann arbeite eben mit einem externen "WorkerScript". Das Hauptprogramm startet mehrere Instanzen dieses Scripts und prüft z.B. in seiner GUI Schleife ob die derzeit laufenden "WorkerScripte" fertig sind, wenn ja wird deren Ergebnis ins Listview eingetragen. Dadurch blockiert nichts mehr und du kannst sogar mehrere oder alle (würde ich bei 300 Rechnern vermeiden) Pings zeigleich laufen lassen.

    Das "WorkerScript" könnte dann recht simpel sein und würde mit wenigen Zeilen Code auskommen.

    meinePing.exe

    [autoit]


    #notrayicon
    ; prüfe Parameter
    if $cmdline[0] < 1 then exit msgbox(0,"Fehler","Bitte gib die IP-Adresse als Parameter an")
    $ip = $cmdline[1]

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

    ; pinge rechner
    $ergebnis = ping($ip)
    $errorcode = @error

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

    ; gebe Ergebnis an Hauptprogramm weiter
    if $ergebnis = 0 then
    $rueckgabe = "Error: " & $errorcode
    else
    $rueckgabe = $ergebnis
    endif
    ; hier gibt es nun tausende möglichkeiten den Wert von $rueckgabe ans Hauptprogramm zu übergeben, siehe dazu die Suche des Forums zum Thema Kommunikation zweier Scripte

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


    Aufgerufen wird das ganze dann vom Hauptprogramm z.B. so oder so ähnlich:

    [autoit]


    for $i = 0 to ubound($aIP)-1
    $laufendeProzesse[$i]=run(@scriptdir & "\meinePing.exe " & $aIP[$i])
    next

    [/autoit]

    Und ja wenn man das sinnvoll lösen will wird es durch die Aufteilung in 2 Programme etwas komplexer, aber letztlich ist es so deutlich performanter.

  • Autenthifizierungsfenster abfangen und füllen

    • misterspeed
    • 26. März 2013 um 10:47

    Deine Screenshots sind von ein und demselben Control. Auf gut Glück die Instance Nummer zu ändern bringt dich nicht weiter. Du musst wirklich mit au3info die einzelnen Elemente im Authentifizierungsfenster markieren. Wenn au3info nur ein großes Element erkennt ist das Fenster eventuell nicht aus Standardcontrols zusammengestellt. Im Anhang findest du nochmals 2 Screenshots wie das ganze ausschaun sollte.

    Wenn dich au3info hier nicht weiterbringen sollte wäre es vielleicht sinnvoll das Programm zu benennen, damit wir selbst testen können oder du versuchst die notwendigen Informationen hiermit zu ermitteln: https://autoit.de/index.php?page=Thread&amp;threadID=32511

    Was deinen Quelltext anbelangt noch ein paar Anmerkungen:

    1. Wenn du eine Endlosschleife verwendest die niemals verlassen wird, dann wird nachfolgender Code, also alles nach "Wend" niemals ausgeführt. Meine Prüfung die ich dir oben gepostet habe gehört also an den Scriptanfang vor die Endlosschleife.
    2. die send() Befehle am Ende brauchst du nicht mehr wenn du mit den controlsettext und controlclick Funktionen arbeitest

    Hier mal ein bereinigtes Script:

    [autoit]


    $sFile = @ScriptDir & "\passwort.txt" ;// Optional Pfad + Name anpassen
    if not fileexists($sFile) then
    $sText = InputBox("Passwort-Box", "Bitte gibt Ihr Passwort für ein und bestätigen Sie dieses mit 'OK'") ;// InputBox erstellen
    FileWrite($sFile, $sText) ;// Text in Datei schreiben
    else
    $sText = fileread($sFile) ; oder meinetwegen auch filereadline, aber wenn die Datei eh nur eine Zeile hat funktioniert fileread genauso
    endif

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

    while 1
    if winexists("Authentifizierung") then
    ControlSetText("Authentifizierung","","[CLASS:TkChild; INSTANCE:5]",$sText) ; pw ins edit feld schreiben , infos zum edit falsch????
    controlclick("Authentifizierung","","[????????????????????????]") ; ok drücken , infos zum button fehlen !!!
    endif
    sleep(100)
    wend

    [/autoit]

    Dateien

    au3info_1.png 50,54 kB – 0 Downloads au3info_2.png 37,86 kB – 0 Downloads
  • Probleme mit der logdatei (FileWrite)

    • misterspeed
    • 25. März 2013 um 14:45

    Das Phänomen, dass es bei der Nutzung von filewrite in sehr seltenen Fällen vorkommt, dass die Datei verschwindet hatte ich auch schon. Daher erstelle ich vor dem filewrite eine Sicherungskopie und vergleiche anschließend die Dateigrößen. Bei Bedarf wird das Backup dann wiederhergestellt oder eben gelöscht. Aus Performancesicht ist es aber eine Katastrophe permanent in die Logdatei zu schreiben, gerade in einer Schleife würde ich das nicht tun.

    Eventuell wäre ein externer Debugger sinnvoller und ressourcensparender. Dieser könnte dann alle Nachrichten die er vom zu überwachenden Script erhält sammeln und dann in Intervallen von einigen Minuten in eine Datei schreiben. Was die if Abfrage angeht würde ich mir keinen Kopf machen, dieser simple Vergleich dürfte wirklich nicht viel Zeit kosten. Aber auch hier könntest du wie schon erwähnt ein sehr einfaches Script schreiben, das dir diese Debugzeilen aus bzw. einkommentiert bevor du das ganze dann kompilierst.

  • Windows 8 mit Touch und GUI_EVENT_PrimaryDown

    • misterspeed
    • 24. März 2013 um 15:48

    Vielleicht hilft dir ja das hier: http://www.mycsharp.de/wbb2/thread.ph…846#post3710846

    Alternativ würde ich einfach mal das Event mitschneiden, das an die GUI gesendet wird. Wie du das im OnEvent Mode machst weiß ich nicht, verwende ich normalerweise nicht in meinen Scripten. Aber im msgloop mode dürfte dich evtl. das Resultat von guigetmsg() weiterbringen.

  • Fehlermeldung wenn VNC keine Verbindung aufbauen kann

    • misterspeed
    • 22. März 2013 um 16:27

    Indem du auf ein Verbindungsfenster und/oder Fehlerfenster wartest? Irgendeine Rückmeldung wird dir RealVNC ja geben wenn etwas nicht wie vorgesehen klappt. Normalerweise müsste ja ein Fenster erscheinen, welches den Remote Computer anzeigt und vermutlich auch dessen IP Adresse im Fenstertitel trägt. Du könntest also vermutlich in einer "do...until" Schleife auf dieses Fenster warten und evtl auch zeitgleich in der Schleife prüfen ob stattdessen eine Fehlermeldung erscheint. Im Fehlerfall dann eben die Schleife mit exitloop verlassen.

    Davon aber mal abgesehen solltest du den Start der VNC Verbindung anderst lösen, da send() ziemlich unzuverlässig ist. Verwende lieber controlsettext() und controlclick(). Alternativ bietet RealVNC auch die Möglichkeit mit cmdline Parametern aufgerufen zu werden, was evtl am zuverlässigsten und einfachsten wäre.

    http://www.realvnc.com/products/open/…ConnectionFiles

  • bestimmte Zeichen aus String entfernen

    • misterspeed
    • 21. März 2013 um 16:29

    Korrekt wäre wohl eher:

    [autoit]


    stringreplace($string,"|","")

    [/autoit]

    Stringsplit entfernt aber natürlich auch das (oder die) definierten Trennzeichen, allerdings hat man danach eben ein Array und keinen "bereinigten" String. Das ist immer dann sinnvoll, wenn man die Struktur erhalten, also einzelnen Stringteile weiterhin getrennt behandeln können möchte. Will man hingegen nur ein Zeichen ersetzen oder entfernen genügt stringreplace.

  • Autenthifizierungsfenster abfangen und füllen

    • misterspeed
    • 20. März 2013 um 20:23

    Das ist so murks. Anstatt send() solltest du eher controlsettext() verwenden. Damit das möglich ist verwendest du zunächst das Tool au3info im SciteEditor (Menü->Tools->au3info) um Details über das Passwortfeld des Authentifizierungsfensters zu erhalten.

    Hier ein Beispiel wie man au3info nutzen kann:
    https://www.youtube.com/watch?v=X2gYPw1itBg

    Du benötigst zum einen die Daten des PW Feldes, als auch die Daten des Login/ok Buttons. Sobald du die notwendigen Informationen hast kannst du die Befehle erstellen:

    z.B. so:

    [autoit]


    ControlSetText("Unbenannt - Editor","","[CLASS:Edit; INSTANCE:1]","meinPW")
    ;controlclick("Unbenannt - Editor","","[CLASS:Button; INSTANCE:1]") ; mein notepad Beispiel hat keinen Button, daher sinnlos das hier zu aktivieren

    [/autoit]

    Willst du nun, dass dein Programm unendlich lange läuft und immerwieder darauf wartet, dass das Fenster erscheint benötigst du eine Endlosschleife.

    [autoit]


    while 1
    if winexists("Unbenannt - Editor") then
    ControlSetText("Unbenannt - Editor","","[CLASS:Edit; INSTANCE:1]","meinPW")
    ;controlclick("Unbenannt - Editor","","[CLASS:Button; INSTANCE:1]") ; mein notepad Beispiel hat keinen Button, daher sinnlos das hier zu aktivieren
    endif
    sleep(100)
    wend

    [/autoit]

    Das Passwort speicherst du in einer Datei, das ist soweit ok, aber wenn du das schon machst, dann wäre es doch unsinnig bei jedem Programmstart erneut den Benutzer danach zu fragen. Stattdessen solltest du so vorgehen:

    [autoit]


    if not fileexists(@scriptdir & "\passwort.txt") then
    $sText = InputBox("Passwort-Box", "Bitte gibt Ihr Passwort für ein und bestätigen Sie dieses mit 'OK'") ;// InputBox erstellen
    FileWrite(@scriptdir & "\passwort.txt", $sText) ;// Text in Datei schreiben
    else
    $sText = fileread(@scriptdir & "\passwort.txt") ; oder meinetwegen auch filereadline, aber wenn die Datei eh nur eine Zeile hat funktioniert fileread genauso
    endif

    [/autoit]

    Da du von mehreren Benuzeraccounts mit verschiedenen Passwörtern sprachst bietet es sich an statt @scriptdir ein Verzeichnis des jeweiligen Windowsbenutzers zu verwenden, also z.B

    [autoit]


    @AppDataDir & "\deinprogrammname\password.txt"

    [/autoit]

    Das fertige Script sollte dann diesen Ablauf haben:

    [autoit]


    #cs
    1. Passwort aus Datei lesen oder wenn Datei nicht vorhanden vom Benutzer erfragen und dann speichern
    2. Endlos Schleife, welche prüft ob das fenster exisitert
    3. Sobald es existiert pw Feld ausfüllen und ok button drücken
    4. Endlosschleife läuft weiter bis Programm beendet wird, also spätestens beim abmelden des Windows Accounts
    #ce

    [/autoit]

    Kleine Bemerkung am Rande:

    Es ist keine Gute Idee Passwörter in Klartext Dateien zu speichern. Ich würde also entweder grundsätzlich den Benutzer beim Programmstart danach fragen und nie speichern, oder wenn schon speichern dann wenigstens verschlüsselt. Dazu solltest du dir mal die Hilfe bezüglich den crypt Funktionen anschauen.

  • Minecraft Server Userliste

    • misterspeed
    • 17. März 2013 um 20:26

    Ich mach dir mal 2 Vorschläge:

    1. Bitte arbeite an deiner Ausdrucksweise bzw. an deinen Formulierungen, Satzbau und der Rechtschreibung. Es ist wirklich schwer deine Postings zu verstehen und grausam diese zu lesen. Wenn man schon selbst keine Lösung findet oder zu faul ist selbst danach zu suchen (google / Forensuche) sollte man wenigstens etwas mehr Arbeit in seine Postings stecken, damit auch jemand versteht was man eigentlich für ein Problem hat. (bezieht sich jetzt nicht nur auf diesen Thread)

    2. Du scheinst absoluter Anfänger in Sachen Autoit zu sein. Daher rate ich dazu, dass du dich erstmal an leichteren Dingen versuchst und dir ein gewisses Grundwissen über die Sprache Autoit aneignest. Dazu bietet sich zum Beispiel das Buch von peethebee an ( https://autoit.de/index.php?page=Thread&amp;threadID=11898 ) und auch die deutsche Autoit Hilfe mit den zugehörigen Beispielscripten der einzelnen Funktionen.

  • Funktion wird nicht ausgeführt.

    • misterspeed
    • 17. März 2013 um 14:41

    Verstehe nicht was du nun willst. Es gibt genau zwei Fälle, entweder JA (Name identisch) oder NEIN (Name nicht identisch). Alles was im NEIN Fall gemacht werden soll muss demzufolge in den ELSE Zweig. Wenn da nichts gemacht werden soll kannst du das else auch komplett weglassen oder den Schleifendurchlauf mit continueloop überspringen. Wenn grundsätlich etwas gemacht werden soll unabhängig ob JA oder NEIN Fall, dann kannst du das vor Beginn oder nach Ende der IF Bedingung tun. Wenn du hingegen nur solange in deiner FOR Schleife vergleichen willst bis zum erstenmal der JA Fall eintritt, dann setze ein exitloop ans ende des JA Falles.

  • Funktion wird nicht ausgeführt.

    • misterspeed
    • 15. März 2013 um 20:28

    Naja da deine "pruef" Funktion in jedemfall etwas in die console schreiben würde, wenn sie aufgerufen wird dürfte wohl die if Bedingung in der Schleife deiner "_MAILGUCK()" Funktion niemals erfüllt sein.

    Ich würde also hier mal sowohl vor als auch nach der If Bedingung debuggen:

    [autoit]


    For $n = 0 To UBound($virtual) - 1
    ;ConsoleWrite($virtual[$n]& @CRLF)
    consolewrite("Stringcheck: " & $maillesen2[0] & " <--> " & $virtual[$n] & @crlf)
    If StringInStr($maillesen2[0], $virtual[$n], 0) Then
    consolewrite("Stringcheck ok!" & @crlf)
    $item = $virtual[$n]

    [/autoit]
  • Schnellere Filterung einer ListView + Zuordung

    • misterspeed
    • 15. März 2013 um 12:54

    Habe sowas auch, allerdings nicht ganz soviele Daten. Ich habe das unter anderem dadurch beschleunigen können, dass ich grundsätzlich alle listview UDF Funktionen rausgeworfen habe, da diese massivst langsamer waren. Bei dir sehe ich z.B. noch

    [autoit]

    _GUICtrlListView_DeleteAllItems($ListView)

    [/autoit]

    Ich lösche stattdessen das ganze Listview Control, baue mir ein neues gefiltertes Array und erzeuge das Listview dann komplett neu. Um die Stammdaten nicht neu einlesen zu müssen verbleibt grundsätzlich ein ungefiltertes Array im Speicher und die Listviews werden je nach Fall direkt aus dem ungefilterten oder eben aus dem ggf. aktualisierten gefilterten Array erstellt. Ich verwende deshalb ein zweites gefiltertes Array, damit das Zuschalten weiterer Filter nicht erfordert, dass man das ungefilterte Array durchlaufen muss, sondern das neue gefilterte Array auch aus einem bereits vorgefilterten Array erstellt werden kann. Du gehst soweit ich das sehe immer das gesamte ungefilterte Array, also alle 50000 Zeilen durch.

    Wichtig sind auch Optimierungen in der Filterschleife, die das gefilterte Array aktualisiert/neu aufbaut. Hier lohnt es sich z.B. wenn man die Filter nach logischer (oder wahrscheinlichster Ausschluss-) Reihenfolge prüft und den Schleifendurchlauf mit continueloop überspringt, wenn bereits eines der x-Filterkriterien ein Ausschlusskriterium ist. Du prüfst derzeit alle Kriterien auf einmal wenn ich das recht sehe. (ist auch unübersichtlich alle Filter in einer einzigen if-Bedingung zu haben...)

    Was du mit LiveSearch meinst müsstest du nochmal genauer beschreiben, ich vermute du möchtest bereits bei der Eingabe eines Suchbegegriffs mit dem Filtern anfangen, was dann wohl mächtig auf die Performance gehen wird. Sowas habe ich mal für ein Script mit mehreren tausend Checkboxen realisiert. (in Wahrheit gibts es nur 120 Checkboxen deren Text bei jeder Ergenisseite aktualisiert wird)

    https://www.youtube.com/watch?v=t7Xbl0zu8GY

    Um die Performance zu steigern solltest du da mit timern arbeiten, also eine kleine Latenz von einigen ms einbauen, bevor erneut geprüft wird ob der Anwender Daten eingegeben hat. So spart man sich unnötige Filterungen und kann gleich mit längeren Suchbegriffen filtern, bzw. nicht sofort für jeden getippten Buchstaben.

  • Unterschied erkennen von zip-rar-exe

    • misterspeed
    • 11. März 2013 um 19:22

    Wo ist das Problem den Unterschied zwischen einer exe/rar/zip Datei zu erkennen? Prüfe einfach in einem switch case die Dateiendung. Im Falle von Archiven bietet es sich an die 7zip.dll oder 7zip.exe beizulegen und zu benutzen. Findest du über die Forensuche zu genüge Beispiele, auch Lösungen die ohne 7zip auskommen. Da du aber auch rar Archive abdecken willst dürfte 7zip die sinnvollste Lösung sein. Mit Windows Boardmitteln kann man nur zip Archive entpacken. Das Wort Updater ignoriere ich einfachmal solange bis du den Begriff vernünftig definierst, siehe dein anderer Thread.

  • Ftp Updater

    • misterspeed
    • 11. März 2013 um 18:09

    Aber dir muss schon klar sein, dass eine Individualprogrammierung bedeutend mehr Kohle kostet als ein Massenprodukt zu kaufen, zumindestens wenn man professionell kalkuliert.

    Und bezüglich deiner Beschreibung kann ich den anderen hier nur beipflichten, daraus wird keiner wirklich schlau. Du fasselst nur igendwas von deiner Fritzbox, FTP, irgendwelchen Updates, rar und zip Archiven, md5 Summen usw.. Ein Programmierer braucht klare Aufgaben, eine möglichst detailierte Skizze was das Programm in welchem Fall tun soll, was das Ziel des ganzen ist... du definierst noch nichteinmal was du unter dem Begriff Updater verstehst. Was soll denn geupdated werden? Deine eigene Software, x-beliebige Software? Woher sollen die Updates stammen? Ich könnte die Liste bis ins unendliche weiterführen, da du einfach garnichts was relevant wäre in deinem Posting klärst.

    Das einzige was der Programmierer leisten soll und muss ist das "WIE" zu realisieren, aber selbst da muss der Auftraggeber klare Grenzen setzen. Wenn du selbst nicht weißt "WAS" du genau willst oder es nicht verständlich und glasklar beschreiben kannst brauchst du erst garnicht davon ausgehen, dass irgendjemand den Umfang abschätzen und irgendwas kalkulieren kann. Vielleicht solltest du dich vorher erstmal mit den Themen Lasten und Pflichtenheft beschäftigen.

  • Fenster im Hintergrund bedienen

    • misterspeed
    • 10. März 2013 um 16:10

    Und das Problem liegt nun wo? Funktioniert absolut einwandfrei, zumindestens bei sichtbarem Fenster, aber für die control Funktionen spielt es wie gesagt keine Rolle ob das Fenster sichtbar oder unsichtbar ist, siehe Beispiel oben.
    Im Anhang findest du alle Au3Info Logs die man braucht, also zumindestens bis zu dem Schritt bei dem ich nun erstmal abgebrochen habe.


    Spoiler anzeigen
    [autoit]


    $setup = @ScriptDir & "\SoACH1b_bi2a.exe"

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

    Run($setup)

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

    Do
    Sleep(10)
    Until WinExists("Windows NT not supported","This game is not officially supported on the Windows NT platform")

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

    ; 1. button ok
    ControlClick("Windows NT not supported","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until WinExists("Willkommen","Willkommen im Installationsprogramm für Siege of Avalon Chapter 1")

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

    ; 2. button weiter
    ControlClick("Willkommen","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until WinExists("Zielpfad wählen","Installation speichert Siege of Avalon Chapter 1")

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

    ; 3. button pfad wählen
    ControlClick("Zielpfad wählen","","[CLASS:Button; INSTANCE:5]")

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

    Do
    Sleep(10)
    Until WinExists("Zielverzeichnis wählen","")

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

    ; 4. edit Zielpfad einfügen
    ControlSetText("Zielverzeichnis wählen","","[CLASS:Edit; INSTANCE:1]","F:\testFolder")
    ; 5. button ok
    ControlClick("Zielverzeichnis wählen","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until Not WinExists("Zielverzeichnis wählen","")

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

    ; 6. weiter Button
    ControlClick("Zielpfad wählen","","[CLASS:Button; INSTANCE:1]")

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

    Do
    Sleep(10)
    Until WinExists("Installation beginnen","Sie sind jetzt zur Installation von Siege of Avalon Chapter 1")

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

    ; 7. letzter weiter button?
    MsgBox(0,"Fertig?","hier würde dann noch der hoffentlich letzte weiter button kommen, das bekommste aber wohl selber hin...")

    [/autoit]

    Dateien

    au3info.txt 6,71 kB – 517 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™