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

  • Umlaut Problem

    • misterspeed
    • 23. März 2014 um 13:19

    Dann verwende eben stattdessen die nativen Funktionen

    [autoit]


    fileopen
    fileread
    filewrite

    [/autoit]

    und gib den entsprechenden Modus (UTF-8 ohne BOM) vor.


    EDIT:

    Oder wenn es unbedingt aus Faulheit die Filewritetoline Funktion sein soll schau in die file.au3, such dir die Funktion raus und erstell dir eine angepasste Kopie davon.


    Hier einfach die Funktionsaufrufe für fileopen, fileread , filewrite entsprechend abändern und dann als _MY_filewritetoline() in dein Script einbinden...

    Spoiler anzeigen
    [autoit]


    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _FileWriteToLine
    ; Description ...: Writes text to a specific line in a file.
    ; Syntax.........: _FileWriteToLine($sFile, $iLine, $sText[, $fOverWrite = 0])
    ; Parameters ....: $sFile - The file to write to
    ; $iLine - The line number to write to
    ; $sText - The text to write
    ; $fOverWrite - If set to 1 will overwrite the old line
    ; |If set to 0 will not overwrite
    ; Return values .: Success - 1
    ; Failure - 0
    ; @Error - 0 = No error
    ; |1 = File has less lines than $iLine
    ; |2 = File does not exist
    ; |3 = Error when opening file
    ; |4 = $iLine is invalid
    ; |5 = $fOverWrite is invalid
    ; |6 = $sText is invalid
    ; Author ........: cdkid
    ; Modified.......: partypooper, MrCreatoR
    ; Remarks .......: If _FileWriteToLine is called with $fOverWrite as 1 and $sText as "", it will delete the line.
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _FileWriteToLine($sFile, $iLine, $sText, $fOverWrite = 0)
    If $iLine <= 0 Then Return SetError(4, 0, 0)
    If Not IsString($sText) Then
    $sText = String($sText)
    If $sText = "" Then Return SetError(6, 0, 0)
    EndIf
    If $fOverWrite <> 0 And $fOverWrite <> 1 Then Return SetError(5, 0, 0)
    If Not FileExists($sFile) Then Return SetError(2, 0, 0)

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

    Local $sRead_File = FileRead($sFile)
    Local $aSplit_File = StringSplit(StringStripCR($sRead_File), @LF)
    If UBound($aSplit_File) < $iLine Then Return SetError(1, 0, 0)
    Local $hFile = FileOpen($sFile, $FO_OVERWRITE)
    If $hFile = -1 Then Return SetError(3, 0, 0)

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

    $sRead_File = ""

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

    For $i = 1 To $aSplit_File[0]
    If $i = $iLine Then
    If $fOverWrite = 1 Then
    If $sText <> '' Then $sRead_File &= $sText & @CRLF
    Else
    $sRead_File &= $sText & @CRLF & $aSplit_File[$i] & @CRLF
    EndIf
    ElseIf $i < $aSplit_File[0] Then
    $sRead_File &= $aSplit_File[$i] & @CRLF
    ElseIf $i = $aSplit_File[0] Then
    $sRead_File &= $aSplit_File[$i]
    EndIf
    Next

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

    FileWrite($hFile, $sRead_File)
    FileClose($hFile)

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

    Return 1
    EndFunc ;==>_FileWriteToLine

    [/autoit]
  • Umlaut Problem

    • misterspeed
    • 22. März 2014 um 21:29

    Ahja und verwende bitte zukünftig die Spoilerfunktion bei derart langen Quellcodes.

  • Dateien oder Arrays vergleichen und bestimmte Zeilen zusammenführen.

    • misterspeed
    • 22. März 2014 um 21:04
    Zitat von autoiter

    Als ich ausprobiert hab array1[$i][0] <> array2[$i][0] hat das nicht funktioniert..


    Ähm naja ich weiß ja nicht wie dein Scriptversuch ausschaut, aber mein Ansatz würde zwei ineinander verschachtelte Schleifen nutzen um beide Arrays miteinander zu vergleichen (bzw. vielmehr die gesplitteten Zeilen der Arrays). Du brauchst also mit meinem Ansatz mindestens zwei Zählervariablen für deine Schleifen. Zweimal die selbe Variable (bei dir $i) nutzen wird natürlich nicht das gewünschte Ergebnis liefern.

    Hier mal evtl. fehlerhafter und unvollständiger pseudocode weil ich zu faul bin dir das ganze Script zu schreiben:


    [autoit]


    $a1 = ...datei 1 einlesen
    $a2 = ...datei 2 einlesen
    global $a3[ubound($a1)][3] ; ergebnis array ist gleich groß wie a1, zumindestens ging das aus deiner Beschreibung hervor...

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

    for $i = 1 to ubound($a1)-1
    $aSplit1 = stringsplit($a1[$i]...@tab...) ; zeile $i aus $a1 gesplittet
    for $j = 1 to ubound($a2)-1
    $aSplit2 = stringsplit($a2[$j]...@tab...) ; zeile $j aus $a2 gesplittet
    if $aSplit1[1] = $aSplit2[1] then ; hier sollte jeweils die id der Zeile beider Arrays stehen, sind diese gleich, dann...
    $a3[$i][0] = $aSplit1[1] ; die ID
    $a3[$i][1] = $aSplit1[3] ; info aus array1
    $a3[$i][2] = $aSplit2[3] ; gefundene info aus array2
    exitloop ; unter der annahme, dass die ID in Array 2 maximal einmal vorkommt, also nie mehr als 2 infos pro ID möglich sind
    endif
    next
    next

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

    _arraydisplay($a3)

    [/autoit]

    Das Script könnte so allerdings abstürzen wenn das Splitten einer Zeile nicht wie gewünscht drei Splitttreffer hat. Du solltest also evtl noch Fehlerabfragen nach dem jeweiligen Zeilensplit einbauen, damit nicht auf nicht existente Arrayindexe zugegriffen wird.

  • Dateien oder Arrays vergleichen und bestimmte Zeilen zusammenführen.

    • misterspeed
    • 22. März 2014 um 19:36
    Zitat von autoiter

    Ich muss dazu sagen, ich erstelle die Dateien in einigen Schritten vorher und könnte da schon anders vorgehen, wenn es angebracht wäre.


    Da du die Dateien selbst erstellst würde ich durchaus vorschlagen das ganze gleich in eine einzige Datei (oder evtl. sogar in eine Datenbank) zu schreiben oder ggf. ganz auf die Datei zu verzichten jenachdem wozu du die Daten brauchst und ob diese nach Programmende noch benötigt werden. Vielleicht solltest du mal deinen kompletten code posten...

    Ansonsten ist das so wie es ist auch kein Problem. Du brauchst nur folgende Funktionen und grundlegende Kenntnisse im Umgang mit Arrays und Schleifen:

    [autoit]


    _filereadtoarray
    Stringsplit
    redim ; ggf zum dynamischen neu Dimensionieren des dritten Arrays, siehe unten

    [/autoit]

    Vorgehensweise sollte eigentlich selbsterklärend sein...

    1. Beide Dateien in separate Arrays einlesen
    2. Zeile(n) innerhalb einer verschachtelten Schleife mit stringsplit in ihre Bestandteile zerlegen (Trennzeichen @TAB)
    3. Jeweils die ID der Zeile des ersten Arrays mit den IDs aller Zeilen aus dem zweiten Array vergleichen
    4. Bei Übereinstimmung der ID jeweils die zugehörigen Infos X und Y in ein drittes 2 dimensionales Array speichern, Aufbau des dritten Arrays: [[ID,InfoX,InfoY]]
    5. Auf Wunsch das 2D Array dann wieder in einen String zerlegen um wie gewünscht per TAB getrennt in eine Datei zu schreiben, Alternativ das Ergebnis gleich in einem String speichern und das dritte Array weglassen...


    Bei fehlendem Wissen bezüglich Arrays: http://www.bug-fix.info/array_tut.htm

  • autom. Refresh für 3rd Party Programm

    • misterspeed
    • 22. März 2014 um 17:55
    Zitat von Shortylaforge

    Dann mal konkreter... Lern ich das halt Pfftt.. :)
    Case $Menu_Program_Choose funktioniert in diesem Fall wegen der For Schleife ja nur beim letzten gelisteten Eintrag. Wie muss ich das umbauen das alle Einträge im Case erfasst und ausgewertet werden?

    Nunja du musst die IDs der Menüeinträge eben in einem Array speichern. So kannst du dann in deiner GUI Schleife alle IDs des Arrays prüfen.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>
    #Include <GuiListBox.au3>

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

    Dim $array1,$main1,$list1
    global $aMenu_Program_Choose[1][2] = [["ID","Titel des Fensters"]]

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

    $windows = WinList()
    $main1 = GUICreate("Auto Refresher",400,400,200,200)
    $Menu_Program = GUICtrlCreateMenu ("ChooseProgram")
    $Menu_Open = GUICtrlCreateMenu ("Open", $Menu_Program)

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

    $j = 0

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

    For $i = 1 To UBound ($windows) - 1
    If $windows[$i][0] <> "" AND IsVisible($windows[$i][1]) Then
    $j += 1
    redim $aMenu_Program_Choose[$j+1][2]
    $aMenu_Program_Choose[$j][0] = GUICtrlCreateMenuItem ($windows [$i][0], $Menu_Open)
    $aMenu_Program_Choose[$j][1] = $windows [$i][0]
    EndIf
    Next

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    ExitLoop
    ; Case $Menu_Program_Choose
    ; MsgBox(0, "", "")
    EndSwitch

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

    for $j = 1 to ubound($aMenu_Program_Choose)-1
    if $msg = $aMenu_Program_Choose[$j][0] then
    msgbox(0,"Debug",$aMenu_Program_Choose[$j][1] & " wurde ausgewählt!")
    exitloop
    endif
    next

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

    WEnd

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

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]
  • autom. Refresh für 3rd Party Programm

    • misterspeed
    • 22. März 2014 um 17:42

    Wie bereits erwähnt wurde solltest du zunächst die Grundlagen beherrschen. Außerdem ist deine Beschreibung viel zu dürftig um dir ernsthaft helfen zu können.

    Prinzipiell wäre ersteinmal zu klären um welches "3rd Party Program" es überhaupt geht bzw. um welche zu Grunde liegende Technologie. Reden wir hier von einer Web Applikation oder von einer lokalen Desktop Applikation?

    Dann solltest du dir außerdem dringend die Frage stellen ob dein Arbeitgeber damit einverstanden ist, dass diese automatische Abmeldung der Anwendung und der automatische Standby des Systems von dir umgangen wird (da letzteres per Gruppenrichtlinien geregelt ist denke ich mal, dass eure IT sich da sehr wohl etwas dabei gedacht hat). Solltest du selbst Administrator sein und somit für diese Applikation verantwortlich sein würde ich eher die Einstellungen der Applikation prüfen und ggf. den Hersteller kontaktieren um zu prüfen ob diese Session Intervalle verlängert oder das Session Timeout ganz abgeschaltet werden kann. Dir sollte aber klar sein, dass es Sicherheitsgründe hat wenn eine Applikation bei Inaktivität einen erneuten Login verlangt. Das selbe gilt natürlich für die GPO welche für den Standby verantwortlich ist, auch hier ist normalerweise die IT Abteilung dein Ansprechpartner.

    Nun gehen wir mal davon aus es juckt niemanden was du mit deiner Workstation tust...

    Im Falle einer Desktop Applikation benötigst du das "Au3info Tool", welches du im Scite Editor findest. Um dir aktiv helfen zu können wäre das "summary log" von Au3Info für das entsprechende Fenster hilfreich. Wenn du Pech hast handelt es sich aber um ein Fenster, welches keine Windows Standardcontrols verwendet. In diesem Fall hilft dir Au3Info nur bedingt weiter und du benötigst letztlich etwas weniger zuverlässige Funktionen (optische Erkennung) zur Automatisierung.

    Handelt es sich um eine Web Applikation benötigst du passende Funktionssammlungen für deinen Browser. Im Standard Autoit Paket sind Funktionen für den Internet Explorer enthalten, hier im Forum findest du außerdem die ff.au3 für Firefox. Ebenfalls hilfreich sind gewisse Browser Addons wie z.B. Firebug um Details über die Elemente der Webseite zu ermittlen.

  • Global Variablen abfragen

    • misterspeed
    • 16. März 2014 um 21:12

    Es gibt schlichtweg keine Programm übergreifenden Variablen. Wenn du mit deinem Hauptprogramm ein anderes startest kennt diese Programm weder Funktionen noch Variablen des Hauptprogrammes. Das einzige was du tun kannst ist deinem zweiten Programm entweder beim Start alle benötigten Daten mitzugeben (z.B. per Parameter wie oben beschrieben oder per Konfigdatei) oder aber du sorgst dafür, dass dein Hauptprogramm auf irgendeine weise mit den anderen Programmen kommunizieren kann (Inter Prozess Kommunikation). Für Letzteres gibt es unzählige Möglichkeiten. Viele erfordern, dass die Teilprogramme deutlich erweitert werden (z.B. TCP Funktionalität), andere funktionieren passiv und erfordern keine Erweiterung der externen Programme. Dein Hauptprogramm könnte das Label des anderen Programmes z.B. einfach mit

    [autoit]

    controlsettext()

    [/autoit]

    verändern. Das Hauptprogramm muss dazu nur wissen wie das Fenster und das zu verändernde control des anderen Programmes anzusprechen sind.

  • array negativ sortieren

    • misterspeed
    • 15. März 2014 um 14:18

    Dann arbeite eben mit 2 Arrays und berücksichtige nur den gefilterten Inhalt des neuen Arrays.

    Beispiel:

    [autoit]


    #include <array.au3>

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

    global $aOld[4] = ["a","b","c","d"]
    global $aNew[5] = ["a","c","d","e","f"]
    global $aResult[1]

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

    ; b wurde gelöscht, e und f sind neu hinzugekommen

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

    $k = 0
    for $i = 0 to ubound($aNew)-1
    $skip = False
    for $j = 0 to ubound($aOld)-1
    if $aNew[$i]=$aOld[$j] then
    $skip = True ; das aktuelle Element des neue Arrays war schon im alten enthalten, also interessiert es uns nicht
    exitloop
    endif
    next
    if $skip = False then
    $aResult[$k] = $aNew[$i] ; das aktuelle Element des neuen Arrays ist wirklich neu und war noch nicht enthalten, also speichern wir es im result Array
    $k+=1
    redim $aResult[$k+1]
    endif
    next
    redim $aResult[$k]

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

    _arraydisplay($aresult)

    [/autoit]
  • array negativ sortieren

    • misterspeed
    • 15. März 2014 um 10:20

    Ich habe einmal etwas ähnliches geschrieben, dabei ging es nicht ums entfernen der mehrfach auftretenden Einträge, sondern um die Anzeige wie oft diese vorkommen. Hier eine modifizierte Fassung die alle Mehrfacheinträge auch entfernen kann:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

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

    Global $testArray[11] = ["WM_KILLFOCUS", "WM_KILLFOCUS", "WM_ENABLE", "WM_SETREDRAW", "UnMountMOM", "MountMOM", "WM_CLOSE", "WM_PAINT", "WM_SETREDRAW", "WM_SETREDRAW", "Mountmom"]

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

    $aUnique2D = _arrayUniqueCount($TestArray, 2) ; 2D Variante
    $aUnique1D = _arrayUniqueCount($TestArray, 1) ; 1D Variante mit geschweiften Klammern
    $aUnique1Drem = _arrayUniqueCount($TestArray, 3) ; doubletten entfernt
    $aUnique1DremNotCasesense = _arrayUniqueCount($TestArray, 3, 0) ; doubletten entfernt (auch bei unterschiedlicher Groß- Kleinschreibuung)

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

    _arraydisplay($aUnique2D,"2D Variante")
    _arraydisplay($aUnique1D,"1D Variante mit geschweiften Klammern")
    _ArrayDisplay($aUnique1Drem, 'Doubletten entfernt')
    _ArrayDisplay($aUnique1DremNotCasesense, 'Doubletten entfernt nicht casesensitiv')

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

    Func _arrayUniqueCount(ByRef $aData, $mode=2, $casesense=1, $sepChar=",") ; mode: 1 = 1D Rückgabe , 2 = 2D Rückgabe, 3 = Doubletten komplett entfernen

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

    If Not IsArray($aData) Then Return -1 ; wichtig: bitte Rückgabe dieser Funktion prüfen bevor weiter gearbeitet wird...

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

    Local $aNew[ubound($aData)][2] ; für 2D Rückgabe
    Local $aNew1D[1] ; für 1D Rückgabe
    Local $sTemp=$sepChar ; string verkettung des ergebnis arrays für schnelle unique prüfung
    Local $j=0 ; zahl der unique treffer

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

    For $i=0 To UBound($aData)-1
    If StringInStr($sTemp,$sepChar & $aData[$i] & $sepChar,$casesense,-1) Then ; stringprüfung arbeitet schneller als große arrays zu durchlaufen und "viele" strings zu vergleichen
    For $k=0 To UBound($aNew)-1 ; bei bereits vorhandenen einträgen müssen wir zwangsweise die bisherigen suchergebnisse durchlaufen um den korrekten index zu finden
    If $aNew[$k][0]=$aData[$i] Then
    $aNew[$k][1]+=1
    ExitLoop
    EndIf
    Next
    Else
    $aNew[$j][0] = $aData[$i]
    $aNew[$j][1] = 1
    $sTemp &= $aData[$i] & $sepChar
    $j += 1
    EndIf
    Next
    ReDim $aNew[$j][2]

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

    ; sofern zwingend ein 1D Array als Ausgabe benötigt wird muss das neue Array noch einmal durchlaufen werden:
    if $mode = 1 Then
    ReDim $aNew1D[UBound($aNew)]
    For $i=0 To UBound($aNew)-1
    If $aNew[$i][1] > 1 Then
    $aNew1D[$i]=$aNew[$i][0] & " {" & $aNew[$i][1] & "x}"
    Else
    $aNew1D[$i]=$aNew[$i][0]
    EndIf
    Next
    $aNew=$aNew1D
    EndIf

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

    if $mode = 3 Then
    ReDim $aNew1D[UBound($aNew)]
    $k = 0
    For $i=0 To UBound($aNew)-1
    If $aNew[$i][1] > 1 Then
    continueloop ; doppelte Einträge überspringen
    Else
    $aNew1D[$k]=$aNew[$i][0]
    $k += 1
    EndIf
    Next
    if $k > 0 Then
    ReDim $aNew1D[$k]
    Else
    Return -2 ; Achtung: Auf Fehlerrückgabe prüfen! Es gab keine einmalig auftretenden Einträge im Array
    EndIf
    $aNew=$aNew1D
    EndIf

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

    Return $aNew
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Splashtext ControlClick Mouseklick

    • misterspeed
    • 14. März 2014 um 20:27

    Mouseclick() kann nicht im Hintergrund erfolgen. Es wird immer in das Fenster geklickt, das an dieser Position gerade im Vordergrund ist. Wenn dein Splashtext also vor dem eigentlichen Fenster liegt landet dein Mausklick im splashtext Fenster, so wie wenn du eben manuell an diese Position klicken würdest. Klicks im Hintergrund oder sogar in unsichtbaren Fenstern sind nunmal nur durch controlclick() möglich, da hier kein echtes klicken simuliert wird sondern die window msg die durch einen Klick ausgelöst werden würde.

    Dass dein controlclick() so nicht funktioniert sollte ja wohl auch klar sein. Zum einen ist die Angabe eines Fenstertitels bzw. einer Fensterdefinition plus Definition des Controls absolut erforderlich, zum anderen beziehen sich die Koordinaten nicht auf den Desktop oder das Fenster, sondern auf das control. Die Koordinatenangabe ermöglicht also bei controlclick den Klick auf eine bestimmte Stelle innerhalb eines Controls. Das kann hilfreich sein wenn man nur eindeutige Daten für ein "Rahmen" control herausfinden kann und darin andere Elemente enthalten sind (z.B. eine eingebettete html Seite in einer GUI, was gelegentlich bei diversen Installern vorkommt).

    Wie dem auch sei vielleicht solltest du einfach mal Klartext reden was diese Klickscripterei für einen Sinn hat bzw. was du damit überhaupt automatisieren willst. Wenn es immernoch um Webseitenautomatisierung geht (war da nicht mal was von wegen Kleinanzeigen undso?), dann schau dir bitte die IE und FF Funktionen an oder benutze eine evtl. vorhandene API der Webseite in Verbindung mit winhttp. Alles andere macht keinen Sinn wie du ja sicherlich inzwischen auch bemerkt hast.

  • Run Problem

    • misterspeed
    • 13. März 2014 um 20:21
    Zitat von AspirinJunkie

    Test.exe wird mit Kommandozeilenbefehl /AutoIt3ExecuteScript und anschließendem au3-Pfad aufgerufen.
    Ich habe im Skript aber niemals eine Funktion /AutoIt3ExecuteScript implementiert - nichts sollte passieren.

    Zitat von AspirinJunkie


    Was du allerdings anscheinend überlesen hast ist mein Hinweis auf /AutoIt3ExecuteScript und dein Skript.
    Warum gehst du davon aus, dass dein Skript etwas mit /AutoIt3ExecuteScript anfangen kann?

    Zitat von AspirinJunkie


    Dein Skript kann keine externen au3-Dateien genauso wie AutoIt3.exe ausführen.
    Du kannst nur im begrenzten Rahmen innerhalb des Skriptes mit Execute() AutoIt-Befehle in einem String interpretieren lassen.


    Du irrst dich hier ein wenig. Jedes kompilierte Autoitscript ist auch ein Autoitinterpreter und kann genauso wie die autoit.exe dafür verwendet werden. Zumindestens solange man beim kompilieren nicht ausdrücklich diese Interpreterfunktionalität abschält:

    [autoit]

    #NoAutoIt3Execute

    [/autoit]

    In den Standard compiler Settings existiert jedenfalls sehr wohl der Parameter "/AutoIt3ExecuteScript" bei jeder ausführbaren Autoit Datei. Man ist hier allerdings auf die nativen Autoit Funktionen beschränkt. Die auszuführenden au3 Dateien dürfen keine includes enthalten, bzw. wenn sie includes enthalten müssen diese mitgeliefert werden und mit korrektem (relativem) Pfad in der au3 eingebunden sein.

    Hier ein Beispiel das auch funktioniert und das Problem von Ilse lösen sollte, sofern keine includes in den Miniklickscripten verwendet werden:


    main.exe / main.au3:

    [autoit]


    ; main.exe, welche als au3 interpreter mißbraucht wird

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

    Global $interpreter
    If @Compiled Then
    $interpreter = @ScriptFullPath
    Else
    $interpreter = @AutoItExe
    EndIf

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

    Global $ProgLink = @ScriptDir & '\test.au3'
    Global $cmd = '"' & $interpreter & '" /AutoIt3ExecuteScript "' & $ProgLink & '"'

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

    debug($interpreter)
    debug($cmd)

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

    Run($cmd)

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

    Func debug($sText)
    If @Compiled Then
    MsgBox(0,@ScriptName,$sText)
    Else
    ConsoleWrite($sText & @CRLF)
    EndIf
    EndFunc

    [/autoit]

    beliebiege test.au3:

    [autoit]


    msgbox(0,@ScriptName,"unkompiliertes au3 script das von main.exe ausgeführt wird")

    [/autoit]
  • Geräte Manager steuern - Grafikkarten Treiber manuell einpflegen

    • misterspeed
    • 13. März 2014 um 19:43

    Ich würde eher ganz auf den Gerätemanager verzichten. Du solltest auch einfach die INF-Datei des Treibers mit shellexecute() ausführen können um die Treiberinstallation anzustossen.

  • Wie kann ich den Befehl zur Virensuche geben

    • misterspeed
    • 8. März 2014 um 21:01

    Ich habe zwar kein Avast, aber Avira dokumentiert das z.B. hier wie man eine Datei per CLI prüfen kann: http://www.avira.com/en/support-for…detail/kbid/229
    Avast wird ähnliche Möglichkeiten anbieten. In Autoit reicht also ein simples run() um den Scanner mit den passenden Parametern zu starten.

    Der Nachteil der CLI Lösung ist aber, dass man abhängig vom Hersteller und dessen CLI Implementierung ist. Soll das Script mit jedem Virenscanner auf x-beliebigen Systemen funktionieren sollte man sich eher die Antivirus API von Microsoft anschauen. Mozilla nutzt diese z.B. in Firefox bzw. Thunderbird um Downloads oder Dateianhänge zu scannen. Dabei wird der Standardvirusscanner des Systems angesprochen, sofern er die MS API implementiert. Mehr dazu findet man hier:

    http://joco.name/2010/12/22/win…p-crash-course/
    http://msdn.microsoft.com/en-us/library/bb776297.aspx
    http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx

  • Win32_PerfRawData_Tcpip_NetworkInterface - Windows 7 Alternative

    • misterspeed
    • 8. März 2014 um 10:51

    Error Code 0 bedeutet in diesem Fall doch dass alles ok ist. Im Fehlerfall würde objcreate() den error code auf 1 setzen.

  • exe generieren

    • misterspeed
    • 4. März 2014 um 19:03

    Ich würde mich eher mal fragen warum du zig exe Dateien erstellen willst. Wenn sich die Programme nur in den Klickkoordinaten unterscheiden wovon ich anhand deines Schnippsels mal ausgehe, dann machts ja wohl mehr Sinn eine exe zu erstellen und die variablen "Klick-Daten" per ini zu regeln. Ggf. macht es dann noch Sinn cmdline Parameter zu definieren um den entsprechenden Modus (Welche Sektion der ini wird gelesen?) beim Programmstart festzulegen.

  • Kombinationen ermitteln

    • misterspeed
    • 1. März 2014 um 15:35

    Die Aufgabe hat so wie du sie beschreibst unendlich viele Lösungen, ausser du schränkst die erlaubten Wertebereiche ausreichend ein. Deshalb solltest du zunächst einmal die Gegebenheiten klar formulieren.

    Deine Gleichung: y = a + b + ... + z

    Ich vermute jetzt mal, dass folgende Bedingungen gelten, auch wenn du das nicht klar definiert hast:

    - die x Summanden sind jeweils positiv (oder auch 0 ?)
    - die x Summanden sind Ganzzahlen ?

    Wenn du das so definierst kannst du die Minimal und Maximalwerte eines Summanden ermitteln (wenn 0 erlaubt ist dann wäre das Maximum bei y=5 die 5, wenn 0 nicht erlaubt ist wäre das Maximum 5-((x-1)*1), die Minimalwerte wären entsprechend 0 oder 1).
    Mit diesen Informationen könnte man dann einfach die dumme Probiermethode nutzen und in einer verschachtelten Schleife für alle x Summanden von Minimum nach Maximum alle Varianten durchprobieren.

  • Script mit anderem Script beenden

    • misterspeed
    • 22. Februar 2014 um 18:05
    [autoit]

    processclose(...)

    [/autoit]
  • Zahlen größenvergleich

    • misterspeed
    • 22. Februar 2014 um 15:34

    Du vergleichst hier keine Zahlen sondern Strings. Beim Stringvergleich wird quasi alphabetisch sortiert und entsprechend größer oder kleiner bestimmt.

    Lösung:

    [autoit]

    If number($input) < number($zahl) Then

    [/autoit]

    Hierdurch erzwingst du, dass die Variablen einen numerischen Datentyp erhalten, dadurch wird kein String sondern ein numerischer Vergleich durchgeführt.

  • ProcessWaitClose als Batch-Script

    • misterspeed
    • 22. Februar 2014 um 13:22

    Vermutlich indem du einfach das "> 0" in der Batchdatei weglässt, denn das ist kein Vergleichsoperator, sondern bedeutet dass das Ergebnis in eine Datei namens 0 geschrieben werden soll. Da mit dem Ergebnis aber nicht weitergearbeitet wird, sondern nur die Umgebungsvariable %errorlevel% geprüft wird sollte das Schreiben in eine Datei überflüssig sein und diente wohl nur zu Debugzwecken.

  • Befehl gesucht - Script pausieren bis ein bestimmtes Control gefunden wird

    • misterspeed
    • 22. Februar 2014 um 10:23

    Wenn man sowas macht sollte man aber bedenken, dass das Script in einer Endlosschleife hängenbleiben könnte. Daher würde ich grundsätzlich noch ein Timeout festlegen, welches dann zum Programmabbruch führt. Sofern kein sinnvoller Zeitraum definiert werden kann bis wann das Control/Fenster spätestens erscheinen sollte könnte man innerhalb der Schleife zumindestens noch Anwendereingaben abfragen um einen manuellen Programm oder Schleifenabbruch zu realisieren.

    Beispiele:

    [autoit]


    $timeout = 60000 ; in ms
    $Fritz14_Class_1 = "[CLASS:Afx:0000000140000000:0]"
    Local $pos[4]
    $timer = timerinit()
    Do
    Sleep(20)
    $pos = ControlGetPos ( $Fritz14_Class_1, "", 59398 )
    Until $pos[0]+$pos[1]+$pos[2]+$pos[3] <> 0 or timerdiff($timer) >= $timeout
    if $pos[0]+$pos[1]+$pos[2]+$pos[3] <> 0 then
    ; weitermachen....
    else
    ; funktion oder programm verlassen ggf. mit Fehlermeldung
    endif

    [/autoit]


    [autoit]


    Opt("TrayMenuMode", 1) ; Standard Traymenüeinträge (Skript pausieren/beenden) werden nicht angezeigt.
    $abbrechen = traycreateitem("Abbrechen")
    ;...
    $Fritz14_Class_1 = "[CLASS:Afx:0000000140000000:0]"
    Local $pos[4]
    Do
    if traygetmsg() = $abbrechen then
    ; z.b. exitloop oder return oder exit
    ; sofern du eine GUI hast könntest du auch guigetmsg verwenden um einen Abbrechen Button der GUI zu überwachen...
    endif
    Sleep(20)
    $pos = ControlGetPos ( $Fritz14_Class_1, "", 59398 )
    Until $pos[0]+$pos[1]+$pos[2]+$pos[3] <> 0
    if $pos[0]+$pos[1]+$pos[2]+$pos[3] <> 0 then
    ; weitermachen....
    else
    ; funktion oder programm verlassen ggf. mit Fehlermeldung
    endif

    [/autoit]

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™