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. Oscar

Beiträge von Oscar

  • FileInstall Funktioniert nicht!?

    • Oscar
    • 30. Dezember 2009 um 04:23
    Zitat von INFACT

    Woran kann das liegen?

    Was steht in $drive?

    Und:

    Zitat von AutoIt-Hilfe

    The destination path of the file with trailing backslash if only the directory is used.

    sowie:

    Zitat von AutoIt-Hilfe

    The destination directory path must already exist before this function is called, or the FileInstall will fail, returning 0 and not creating the file, nor path. See DirCreate() for information about creating the directory path.

  • Dateien löschen die älter als 90 Tage sind

    • Oscar
    • 28. Dezember 2009 um 15:35

    Ich habe Deine Ideen mal "geklaut" und mit in mein Script (zu finden unter Scripte) eingebaut. Wirst auch als Author mit aufgeführt. :)

  • Dateien nach einer bestimmten Anzahl an Tagen löschen (Funktion)

    • Oscar
    • 28. Dezember 2009 um 14:43

    Eine neue Version.
    Jetzt kann man auch angeben, ob die leeren Unterverzeichnisse ebenfalls gelöscht werden sollen.
    Und ob auch Dateien gelöscht werden sollen, die gegen das Löschen geschützt sind ("R"-Attribut).

    Micha_he: Ich habe Dich mal mit bei den Author(s) eingetragen (Ideenklau). :)

  • Dateien löschen die älter als 90 Tage sind

    • Oscar
    • 28. Dezember 2009 um 13:40

    Micha_he: diese Zeile:

    [autoit]

    If StringInStr(FileGetAttrib($ordner & $file),"D") > 0 Then

    [/autoit]


    kann man ab AutoIt-Version 3.3.2.0 jetzt so schreiben:

    [autoit]

    If @extended Then

    [/autoit]


    weil FileFindNextFile dort jetzt eine "1" zurückgibt, wenn es sich um ein Verzeichnis handelt.

    und Dein:

    [autoit]

    FileClose($search2)

    [/autoit]


    muss sich außerhalb der If...EndIf-Anweisung befinden, sonst wird das Filehandle nicht geschlossen, wenn kein Fehler auftritt.
    Die Idee mit dem löschen des leeren Verzeichnisses hatte ich auch erst, aber dann dachte ich, eigentlich will man doch nur die alten Dateien loswerden, nicht die Ordnerstruktur. :S
    Obwohl könnte man optional machen...
    Das mit dem setzen der Attribute finde ich etwas "zuviel am Anwender vorbei". Eigentlich setzt man das "r"-Flag ja gerade, um eine Datei vor dem (ungewollten) löschen zu schützen.

  • Post daten senden

    • Oscar
    • 28. Dezember 2009 um 10:33

    Die IE-Funktionen müssen nicht in einem sichtbaren Fenster ablaufen. Das geht auch mit versteckten Fenstern.

    abgeändertes Beispiel aus der Hilfe:

    Spoiler anzeigen
    [autoit]


    #include <IE.au3>
    $oIE = _IECreate ("http://www.google.com", 0, 0)
    $oForm = _IEFormGetObjByName ($oIE, "f")
    $oQuery = _IEFormElementGetObjByName ($oForm, "q")
    _IEFormElementSetValue ($oQuery, "AutoIt IE.au3")
    _IEFormSubmit($oForm)
    _IELoadWait($oIE)
    $text = _IEBodyReadText($oIE)
    MsgBox(0,0,$text)

    [/autoit]
  • Post daten senden

    • Oscar
    • 28. Dezember 2009 um 08:36

    Hast Du Dir schonmal die _IE...-Funktionen angesehen?
    Hier könnte vielleicht _IEFormElementGetObjByName() ganz hilfreich sein.

  • Dateien löschen die älter als 90 Tage sind

    • Oscar
    • 28. Dezember 2009 um 06:33
    Zitat von tokenizer


    Und ich dachte autoit sollte eine Erleichterung darstellen...
    Ich glaube ich versuche es doch erst mal mit einem *einfachen* Batch-Programm.

    Trotzdem vielen Dank für Deine Unterstützung.

    Aller Anfag ist schwer.
    Daher sollte man manchmal garnicht erst anfangen ;)

    Wenn Dir das zu schwer ist, dann habe ich hier eine Funktion für Dich. :)

  • Logowahl

    • Oscar
    • 28. Dezember 2009 um 06:26

    Sehe ich genauso.
    Der Schriftzug "AutoIt.de" sollte aber (nach Deinem Sieg ;) ) in einer anderen (auffälligeren) Farbe, IHMO.

  • Dateien nach einer bestimmten Anzahl an Tagen löschen (Funktion)

    • Oscar
    • 28. Dezember 2009 um 06:14

    _FileDeleteAfterXDays

    Diese Funktion löscht Dateien, die älter sind als die angegebene Anzahl an Tagen. Das anzugebene Verzeichnis kann auch rekursiv (inkl. Unterverzeichnisse) durchsucht werden.

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    _FileDeleteAfterXDays('c:\Temp\', 10, True)

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

    ;===============================================================================
    ; Function Name: _FileDeleteAfterXDays($sPath, $iDays[, $bForceDel][, $bRek][, $bDirDel][, $bLog])
    ; Description:: löscht Dateien in einem ausgewähltem Verzeichnis (rekursiv)
    ; nach einer angegebenen Anzahl von Tagen
    ; Parameter(s): $sPath = Verzeichnis, aus dem die Dateien gelöscht werden sollen.
    ; $iDays = Dateien, die älter als $iDays (in Tagen) sind, löschen.
    ; $bForceDel = wenn "True" werden auch Dateien/Verzeichnisse gelöscht,
    ; die gegen löschen geschützt sind ("R"-Attribut)
    ; $bRek = wenn "True" wird das Verzeichnis rekursiv (inkl. Unter-
    ; verzeichnisse) durchsucht.
    ; $bDirDel = wenn "True" wird das Unterverzeichnis gelöscht, wenn
    ; es (aufgrund der Löschaktion) leer ist.
    ; $bLog = wenn "True" wird das Ergebnis der Löschaktion in die
    ; Console geschrieben.
    ; Requirement(s): AutoIt-Version min. v3.3.2.0
    ; #include <Date.au3>
    ; Return Value(s): bei Erfolg Rückgabe = 1
    ; bei Fehler Rückgabe = 0
    ; und @error:
    ; 1 = $iDays ist keine oder eine negative Zahl
    ; 2 = Das übergebene Verzeichnis existiert nicht oder ist leer.
    ; Author(s): Oscar (http://www.autoit.de)
    ; Micha_he (http://www.autoit.de)
    ;===============================================================================
    Func _FileDeleteAfterXDays($sPath, $iDays, $bForceDel = False, $bRek = True, $bDirDel = True, $bLog = True)
    Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet
    If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Then Return SetError(2, 0, 0)
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    If $bRek Then
    _FileDeleteAfterXDays($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog)
    If $bDirDel Then
    $hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
    If @error Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = DirRemove($sPath & $sFile)
    If $bLog Then ConsoleWrite('Delete Folder "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    FileClose($hEmpty)
    EndIf
    EndIf
    Else
    $sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    If _DateDiff('D', $sDate, _NowCalc()) > $iDays Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = FileDelete($sPath & $sFile)
    If $bLog Then ConsoleWrite('Delete File "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    EndIf
    WEnd
    FileClose($hSearch)
    Return 1
    EndFunc

    [/autoit]

    Dateien

    _FileDeleteAfterXDays.au3 3,12 kB – 520 Downloads
  • STDoutread / Consolewrite

    • Oscar
    • 27. Dezember 2009 um 20:41

    Das funktioniert schon per ConsoleWrite, nur die Abfrage und der Programmstart war falsch.
    So geht's:
    Das folgende als testworker.exe compilieren:

    [autoit]


    ConsoleWrite("test")

    [/autoit]

    Und das Startscript sieht dann so aus:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    $mainwindow = GUICreate("Hello World", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $startbutton = GUICtrlCreateButton("start", 20, 50, 60)
    $readbutton = GUICtrlCreateButton("read", 100, 50, 60)
    GUICtrlSetOnEvent($startbutton, "startbutton")
    GUISetState(@SW_SHOW)

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

    While True
    Sleep(100)
    WEnd

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

    Func startbutton()
    Local $sPID, $sOut
    $sPID = Run(@ScriptDir & "\testworker.exe", @ScriptDir, Default, $STDOUT_CHILD)
    Do
    $sOut &= StdoutRead($sPID)
    Until @error <> 0
    MsgBox(0, "read", $sOut)
    EndFunc ;==>startbutton

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit]
  • Ip Scanner Problem

    • Oscar
    • 25. Dezember 2009 um 17:44

    Also bei mir ist es der Ping-Befehl, der das Zeitlimit negativ beeinflusst.
    Aber mir ist gerade aufgefallen, dass man ohne _TCPNameToIP() auskommen kann, weil der DOS-Ping auch eine Namensauflösung beinhaltet.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Constants.au3>
    $iTimer = TimerInit()
    $aRange = _ScanIPRange('192.168.1.')
    ConsoleWrite(Round(TimerDiff($iTimer) / 1000, 3) & ' sek.' & @CR)
    _ArrayDisplay($aRange)

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

    Func _ScanIPRange($sIP_Range, $iWaitms = 100)
    If Not StringRegExp($sIP_Range, '\d{1,3}\.\d{1,3}\.\d{1,3}\.') Then Return SetError(1, 0, 0)
    Local $sPID, $sOut, $aOut[1][2], $sTmp
    For $i = 1 To 255
    $sOut = ''
    ToolTip('Scanne IP: ' & $sIP_Range & $i)
    $sPID = Run(@ComSpec & ' /c ping -a -w ' & $iWaitms & ' -4 -n 1 ' & $sIP_Range & $i, @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Do
    Sleep(10)
    $sOut &= StdoutRead($sPID)
    Until @error <> 0
    If Not StringInStr($sOut, '100% Verlust') Then
    $aOut[UBound($aOut) - 1][0] = $sIP_Range & $i
    $sTmp = StringRegExpReplace($sOut, '(?s).+Ping (\H+?) .+', '$1')
    If $sTmp = 'wird' Then $sTmp = 'Hostname nicht gefunden'
    $aOut[UBound($aOut) - 1][1] = $sTmp
    ReDim $aOut[UBound($aOut) + 1][2]
    EndIf
    Next
    ReDim $aOut[UBound($aOut) - 1][2]
    ToolTip('')
    Return $aOut
    EndFunc ;==>_ScanIPRange

    [/autoit]
  • Mit Entertaste zum nächsten Input Feld wechseln

    • Oscar
    • 25. Dezember 2009 um 10:44

    Der Ausdruck hinter While wird bei jedem Schleifendurchlauf geprüft. Wenn dabei True herauskommt, wird die Schleife fortgesetzt.
    Der Befehl Sleep(50) gibt aber immer eine 1 (True) zurück und somit ist das eine Endlosschleife.

    [autoit]


    While Sleep(50)
    WEnd

    [/autoit]


    ist also das Gleiche, wie:

    [autoit]


    While True
    Sleep(50)
    WEnd

    [/autoit]
  • Frohe Weihnacht!!!

    • Oscar
    • 25. Dezember 2009 um 10:33

    Wieso spät? Ist doch heute erst Weihnachten. :D

    Also: Frohe Weihnacht, alle zusammen!

  • nuts hats [Geburtstag!!]

    • Oscar
    • 25. Dezember 2009 um 10:28

    Happy Birthday!
    Alles Gute zum neuen Lebensjahr.

    Und ein frohes Weihnachtsfest. :)

  • Ip Scanner Problem

    • Oscar
    • 25. Dezember 2009 um 09:26

    Wenn man eine nicht existierende IP-Adresse anpingt, dauert es immer relativ lange, bis der Ping-Befehl "reagiert".
    Beim DOS-Ping kann man die Wartezeit einstellen. Allerdings nur bis ca. 100ms runter.
    Hier mal eine Funktion dafür:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Constants.au3>
    #include <Inet.au3>
    $iTimer = TimerInit()
    $aRange = _ScanIPRange('192.168.1.')
    ConsoleWrite(Round(TimerDiff($iTimer) / 1000, 3) & ' sek.' & @CR)
    _ArrayDisplay($aRange)

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

    Func _ScanIPRange($sIP_Range, $iWaitms = 100)
    If Not StringRegExp($sIP_Range, '\d{1,3}\.\d{1,3}\.\d{1,3}\.') Then Return SetError(1, 0, 0)
    Local $sPID, $sOut, $aOut[1][2]
    TCPStartup()
    For $i = 1 To 255
    $sOut = ''
    $sError = ''
    ToolTip('Scanne IP: ' & $sIP_Range & $i)
    $sPID = Run(@ComSpec & ' /c ping -w ' & $iWaitms & ' -4 -n 1 ' & $sIP_Range & $i, @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Do
    Sleep(10)
    $sOut &= StdoutRead($sPID)
    Until @error <> 0
    If Not StringInStr($sOut, '100% Verlust') Then
    $aOut[UBound($aOut) - 1][0] = $sIP_Range & $i
    $aOut[UBound($aOut) - 1][1] = _TCPIpToName($sIP_Range & $i)
    ReDim $aOut[UBound($aOut) + 1][2]
    EndIf
    Next
    ReDim $aOut[UBound($aOut) - 1][2]
    ToolTip('')
    TCPShutdown()
    Return $aOut
    EndFunc ;==>_ScanIPRange

    [/autoit]
  • GetMonitor-Funktion testen

    • Oscar
    • 24. Dezember 2009 um 16:03

    Der Hinweis auf den Reg_Binary-Key "VolatileSettings" hat mich entscheidend weiter gebracht. Jetzt habe ich die Funktion für Win7 fertig.
    Es werden immer Einträge aus RegKeys benutzt, kein "raten" mehr. :thumbup:

    So weit erstmal die Win7-Monitor-Erkennung:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $aMonitor = _CI_GetMonitor()
    _ArrayDisplay($aMonitor)

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

    Func _CI_GetMonitor()
    Local $iCount = 0, $sHKLM, $sDeviceVideo, $iMaxObjectNumber, $sVideo, $sTmp, $sUnitedVideo, $sMfg, $sDeviceDesc, $sDPMS, $sDriver, $x, $y, $xRes, $yRes, $sMaxRes
    Local $aMonitor[$iCount + 1][6] = [['Hersteller:', 'Modell:', 'DPMS-Untersützung:', 'Position (x, y):', 'akt. Auflösung:', 'max. Auflösung:']]
    $sHKLM = 'HKEY_LOCAL_MACHINE'
    If @OSArch <> 'X86' Then $sHKLM &= '64'
    Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
    $sDeviceVideo = $sHKLM & '\HARDWARE\DEVICEMAP\VIDEO'
    $iMaxObjectNumber = Number(String(RegRead($sDeviceVideo, 'MaxObjectNumber')))
    If $iMaxObjectNumber > 0 Then
    For $i = 0 To $iMaxObjectNumber
    $sVideo = StringReplace(RegRead($sDeviceVideo, '\Device\Video' & $i), '\Registry\Machine', $sHKLM)
    $sTmp = String(RegEnumVal($sVideo & '\VolatileSettings', 1))
    If $sTmp <> '' Then
    $sUnitedVideo = StringReplace($sVideo, '\Control', '\Hardware Profiles\UnitedVideo\Control')
    $x = Number(String(RegRead($sUnitedVideo, 'Attach.RelativeX')))
    If $x > 2 ^ 31 Then $x = -BitXOR($x, 0xffffffff)
    $y = Number(String(RegRead($sUnitedVideo, 'Attach.RelativeY')))
    If $y > 2 ^ 31 Then $y = -BitXOR($y, 0xffffffff)
    $xRes = Number(String(RegRead($sUnitedVideo, 'DefaultSettings.XResolution')))
    $yRes = Number(String(RegRead($sUnitedVideo, 'DefaultSettings.YResolution')))
    $sMonitor = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', $iCount)
    $sMfg = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor, 'Mfg')
    $sMfg = StringRegExpReplace($sMfg, '.+;(.+)', '$1')
    $sDeviceDesc = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor, 'DeviceDesc')
    $sDeviceDesc = StringRegExpReplace($sDeviceDesc, '.+;(.+)', '$1')
    $sDPMS = Number(String(RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor & '\Device Parameters', 'DPMS')))
    $sDriver = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor, 'Driver')
    $sMaxRes = String(RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\Class\' & $sDriver, 'MaxResolution'))
    $sMaxRes = StringReplace($sMaxRes, ',', ' x ')
    $iCount += 1
    ReDim $aMonitor[$iCount + 1][6]
    $aMonitor[$iCount][0] = $sMfg
    $aMonitor[$iCount][1] = $sDeviceDesc
    $aMonitor[$iCount][2] = StringMid('NeinJa', $sDPMS * 4 + 1, 4)
    $aMonitor[$iCount][3] = $x & ', ' & $y
    $aMonitor[$iCount][4] = $xRes & ' x ' & $yRes
    $aMonitor[$iCount][5] = $sMaxRes
    EndIf
    Next
    Return $aMonitor
    EndIf
    Case Else
    MsgBox(0,0, 'OS wird z.Zt. nicht unterstützt.')
    EndSwitch
    EndFunc ;==>_CI_GetMonitor

    [/autoit]


    Nach Weihnachten mache ich mich an die Funktion für den Rest. Danke, Bitboy, für den Hinweis. :)

    User mit Win7 könnten die Funktion mal testen. Normalerweise müsste es jetzt passen...

  • String herausfiltern

    • Oscar
    • 23. Dezember 2009 um 18:09

    Mit StringRegExp ist es einfacher:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Inet.au3>
    Global $LINK[99999]
    $LINK[1] = "http://www.gtainside.com/download.php?do=cat&id=341" ;Cars
    $HTML = _INetGetSource($LINK[1])
    $aCars = StringRegExp($HTML, '<img src="gfx/dot.gif"> <a href="download.php\?do=cat\&id=(\d+)">(.+)</a>', 3)
    _ArrayDisplay($aCars)

    [/autoit]
  • GetMonitor-Funktion testen

    • Oscar
    • 23. Dezember 2009 um 17:52

    Ich hätte gern:
    - Hersteller
    - Modell
    - akt. Auflösung
    - max. Auflösung
    - Position bei mehreren Monitoren

    Das Ganze nicht nur für den primären Monitor, sondern für alle momentan angeschlossenen.
    Und damit es nicht zu leicht ;) wird, auch noch mit allen Windows-Versionen kompatibel.
    Das ist verdammt kompliziert, weil Microsoft von Version zu Version die Reg-Einträge verändert hat. ?(
    Ich vergleiche hier schon die Registries von drei Rechnern:
    WinXP mit 1 Monitor (analog),
    WinXP mit 2 Monitoren (analog und Notebook-Display)
    und Win7 mit 2 Monitoren (beide per DVI).

  • Relais-Karte... Ports auslesen

    • Oscar
    • 23. Dezember 2009 um 17:40

    Das heißt, Dir geht es gar nicht darum digitale Daten einzulesen, sondern Dich interessiert nur der Relais-Status?
    Also keine echte Regelschleife, sondern lediglich die Steuerdaten. Die werden doch aber von Deinem Programm gesetzt, oder?
    Somit bräuchtest Du diese doch nur in einer Variablen ablegen und auswerten?! Oder habe ich das falsch verstanden?

  • GetMonitor-Funktion testen

    • Oscar
    • 22. Dezember 2009 um 21:22

    Unter Win7 kommt damit das Gleiche raus, wie mein Screenshot bei Post #28.

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™