Außerdem wäre es - meiner persönlichen Meinung nach - schöner die Datei in beispielsweise 2kb 'Häppchen' zu verschicken. Sonst ist es während der Dateiübertragung nicht mehr möglich andere Pakete auszutauschen...
Beiträge von BinDannMalWeg
-
-
In deiner "Endversion" sind aber noch einige nicht so kleine Fehler... Du darfst Scripte nicht einfach ineinader kopieren.
Zum Beispiel läufst du nach jedem Hinzufügen der Dateien eines Ordners zur Liste, ALLE Dateien ALLER Ordner noch einmal durch. - Das muss ja Ewigkeiten gehen.
Sei mir nicht böse, aber hier die - hoffentlich - fehlerfreie Version:Spoiler anzeigen
[autoit]#include <Date.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>
Local $FileList = ObjCreate("System.Collections.ArrayList"), $iAlter, $aFolderList, $hLogFile = FileOpen("D:\Folder.log", 1)$iAlter = InputBox("Maximales Alter in Tagen angeben", "Maximales Alter in Tagen angeben:", "10")
[/autoit] [autoit][/autoit] [autoit]
FileWrite($hLogFile, " ---------------------------- " & _NowCalc() & " ---------------------------- " & @CRLF)_FileReadToArray("D:\Folder.txt", $aFolderList)
[/autoit] [autoit][/autoit] [autoit]
If @error Then
MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
Exit
EndIfFor $k = 1 To $aFolderList[0]
[/autoit] [autoit][/autoit] [autoit]
_LoadFilesToList_Recursive($FileList, $aFolderList[$k])
NextFor $i = 0 To $FileList.Count - 1
[/autoit] [autoit][/autoit] [autoit]
$sModDate = _FileDateString2Calc(FileGetTime($FileList.Item($i), 0, 1))
$iDiff = _DateDiff('D', $sModDate, _NowCalc())
If $iDiff > $iAlter Then
FileWrite($hLogFile, $FileList.Item($i) & " ------ " & $iDiff & " Tage nicht verändert." & @CRLF)
EndIf
NextFileWrite($hLogFile, @CRLF)
[/autoit] [autoit][/autoit] [autoit]
FileClose($hLogFile)Func _LoadFilesToList_Recursive(ByRef $List, $sDir)
[/autoit] [autoit][/autoit] [autoit]
Local $hSearch, $sFile
If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
$hSearch = FileFindFirstFile($sDir & "*")
While True
$sFile = FileFindNextFile($hSearch)
If @error Then
ExitLoop
ElseIf @extended Then
_LoadFilesToList_Recursive($List, $sDir & $sFile & "\")
Else
$List.add($sDir & $sFile)
EndIf
WEnd
EndFunc ;==>_LoadFilesToList_RecursiveFunc _FileDateString2Calc($filedate)
[/autoit]
Return StringRegExpReplace($filedate, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$1/$2/$3 $4:$5:$6")
EndFunc ;==>_FileDateString2Calc -
habe mir gerade autoit geladen und hab von daher noch überhaupt keine
Ahnung. Bin auf der suche nach nem tutorialSo weit so gut. Dies ist der Punkt an dem du dich erst einmal mit anderen viel fundamentaleren Dingen beschäftigen solltest. Hier in unserem Forum haben wir ein paar schöne Tutorials, die du durcharbeiten kannst bzw. solltest. Danach schaust du dir am besten noch das "Sauber Programmieren" Tutorial an. Wenn du die Hürden dann gemeistert hast kann es los gehen.
ZitatUm welche Webseite geht es konkret?
-
Vielleicht hilft es dir, wenn du dir zumindest ein oder zwei Grundlagen Tutorials anschaust und sie auch durcharbeitest bzw. alles selbst ausprobierst. Dann sind sehr sehr schnell Dinge wie Schleifen kein Problem mehr. Das mit der Variable $MaxAge kannst du ja machen wie du es gerne hättest... Zum Thema _LoadFilesToList_Recursive: Ich habe die Methode so geschrieben, dass der übergebenen Liste ($FileList) alle gefundenen Dateien angeheftet werden. Wenn du wissen willst, was du mit der Liste "$FileList" dann alles anfangen kannst schaust du dir am besten mal den Punkt "Liste" in diesem Beitrag an.
-
Versteh ich das richtig das somit es nicht festgelegt werden muss wie viele Pfade in der txt stehen? Das mit den Arrays hab ich noch nicht wirklich verstanden Man könnte ja nun statt der letzten msgBox Box die Suche in den Ordnern/Pfaden starten, mal schauen ob ich das hinbekomme
Absolut richtig
Ich hab mal drüber geschaut:Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>
#include <Date.au3>Global $aFolderList, $aMaxAge
[/autoit] [autoit][/autoit] [autoit]
$aMaxAge = InputBox("Aktualisierungszeitraum", "Wie viele Tage alt dürfen die Dateien sein?")_FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
[/autoit] [autoit][/autoit] [autoit]
If @error Then
MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
Exit
EndIf_ArrayDisplay($aFolderList) ; alle Ordner im Array anzeigen
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen
[/autoit]
$aFiles = _FileListToArray($aFolderList[$i], 1)
If Not IsArray($aFiles) Then ContinueLoop
For $k = 1 To $aFiles[0]
$time = FileGetTime($aFiles[$k])
$datediff = _DateDiff("D", $time[0] & "/" & $time[1] & "/" & $time[2], $tage[3] & "/" & $tage[2] & "/" & $tage[1])
If $datediff <= $tage Then
;...
EndIf
Next
NextHier mal wie ich das ganze angehen würde - gerade wenn es später auch noch um Unterordner geht...
Spoiler anzeigen
[autoit]#include <Date.au3>
[/autoit] [autoit][/autoit] [autoit]
Local $FileList = ObjCreate("System.Collections.ArrayList"), $iMaxAge = 7_LoadFilesToList_Recursive($FileList, "C:\Users\Christoph\Downloads\") ; alle dateien in den angegeben ordnern und deren unterordnern werden gesucht und in $FileList gespeichert
[/autoit] [autoit][/autoit] [autoit]
_LoadFilesToList_Recursive($FileList, "C:\Users\Christoph\Desktop\")
_LoadFilesToList_Recursive($FileList, "C:\Users\Christoph\Appdata\")ConsoleWrite("Gefundene Dateien: " & $FileList.Count & @LF)
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $FileList.Count - 1 ; wir gehen alle dateien durch
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($FileList.Item($i) & @LF)
; IF File = noch nicht zu alt THEN
; $FileList.Remove($i)
; $i -= 1
;ENDIF
NextConsoleWrite("Zu Alte Dateien: " & $FileList.Count & @LF)
[/autoit] [autoit][/autoit] [autoit]Func _LoadFilesToList_Recursive(ByRef $List, $sDir)
[/autoit]
Local $hSearch, $sFile
If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
$hSearch = FileFindFirstFile($sDir & "*")
While True
$sFile = FileFindNextFile($hSearch)
If @error Then
ExitLoop
ElseIf @extended Then
_LoadFilesToList_Recursive($List, $sDir & $sFile & "\")
Else
$List.add($sDir & $sFile)
EndIf
WEnd
EndFunc ;==>_LoadFilesToList_RecursivePS: Drück in Scite ab und zu mal Strg & T
-
Ich habe mir mal erlaubt dein Script von den kleinen Fehlern zu befreien und es ein wenig "aufzupeppen"
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>
Global $aFolderList_FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
[/autoit] [autoit][/autoit] [autoit]
If @error Then
MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
Exit
EndIf_ArrayDisplay($aFolderList) ; alle Ordner im Array anzeigen
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen
[/autoit]
MsgBox(0, "Ordner Nummer " & $i & " aus Array", $aFolderList[$i], 2)
Next -
Spontan habe ich dazu 2 Ideen:
- Du könntest zum Beispiel einen roten/farbigen Punkt an die Tür kleben. Wenn nun die Tür geöffnet wird bewegt dich der Punkt und der Pixel wo der Punkt war ist nicht mehr rot...
- Alternativ könntest du auch 'einfach' warten bis sich im Bild überhaupt etwas ändert und dann die Aufnahme starten und nach einer gewissen Zeit ohne Bewegung wieder beenden. Je nach Sichtfeld der Kamera könnte man auch eine gewisse Toleranz implementieren, damit die Katze eben keinen "Alarm" auslöst... -
1.) Du zerlegst meine paar Beispielzeilen in den String $sHTML. Das sieht hier nach viel "Schreibarbeit" aus. Ich habe aber den gesamten Quelltext der Site in der Zwischenablage. Reicht es hier aus, die Zwischenablage in eine Variable auszulesen, oder muss hier noch was "von Hand" gemacht werden.
Die Variable $sHTML und die Zeilen in denen Teile deines Quelltextes hineinschreibe waren allein zum Testen da. Wichtig ist eigentlich nur Zeile 19. Wie du nun den Quelltext in eine Variable bekommst kannst du dir aussuchen. Du könntest beispielsweise statt $sHTML auch einfach ClipGet() schreiben und alles über Zeile 19 löschen...;)
2.) Fehlt mir die Logik, woher das Script weiss, wenn es z.B. (an Deinem Beispiel) in Zeile 4 ein "QT" findet, das dann die "zksMID" in Zeile 2 interessant ist und gezogen werden muss.
Leider habe ich gerade nicht die Zeit, um das ganze RegEx-Pattern für dich aufzubröseln, aber ich erkläre es dir jetzt mal vereinfacht so: Das Pattern 'sucht' im Quelltext nach einer ID und schaut dann noch ob "kurz darauf" ein <td>QT (oder 123 oder ABC) auftritt. Zur Veranschaulichung kannst du auch mal folgendes tun: Wenn du in der "Oder-Klammer" das "?:" rauslöschst, wird dir im Array zusätzlich immer noch das QT oder 123 oder ABC ausgegeben.
Ich hoffe ich hab es einigermaßen verständlich erklärt...
Achja: Wenn du den "Quelltext" von einer Internetseite kopierst kannst du dir das kopieren sparen, indem du mit deinem Script die Seite direkt herunterlädst. (InetGet;InetGetSource) -
...für die kleine Änderung am Script lern ich mich jetzt nicht extra in Regex ein
Kann man sowas irgendwie hinbekommen ?
Und genau an dieser Stelle setzt nun RegEx an.
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$sHTML = '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
$sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
$sHTML &= '<td>QT / 183825683041081 / REG-FT 15 </td>' &@LF
$sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
$sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
$sHTML &= '<td>Q1T / 183825683041081 / REG-FT 15 </td>' &@LF
$sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
$sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
$sHTML &= '<td>ABC / 183825683041081 / REG-FT 15 </td>' &@LF
$sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
$sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
$sHTML &= '<td>1234 / 183825683041081 / REG-FT 15 </td>' &@LF
$sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
$sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
$sHTML &= '<td>LSD / 183825683041081 / REG-FT 15 </td>' &@LF$aResult = StringRegExp($sHTML,'(?s)id=(\w+?)\".*?<td>(?:QT|ABC|123) ',3)
[/autoit]
If IsArray($aResult) Then
_ArrayDisplay($aResult)
Else
ConsoleWrite("Nichts Gefunden!" & @LF)
EndIf
"(?:QT|ABC|123)" Dieser Teil des Patterns funktioniert wie ein Oder: Es werden Einträge gefunden, die entweder ein "QT" oder "ABC" oder "123" haben. Das kannst du dann so anpassen, wie du es brauchst... -
Das geht so nicht - die erste While-Schleife wird nie verlassen, versuch bitte die zweite Schleife in die erste zu integrieren...
-
Er wird wohl nicht an das benötigte "http://" zu Beginn der URL gedacht haben...
-
-
BugFix - Dazu kann ich nur eins sagen wow.
Du sagst es geht jetzt "ans Eingemachte" und da ich nicht davon ausgehe, dass du vor hast dich über deine Marmeladen-Vorräte herzumachen wollte ich mal fragen: Was kommt denn da noch? bzw. Was hast du noch vor oder was lässt sich mit Sublime da noch alles machen? -
Zunächst einmal ist es um einiges praktischer das Spielfeld in einem 3D-Array und die Wörter ganz einfach in einem normalen Array zu speichern.
Das Spielfeld-Array hat dann also eine Dimension für die X-Koordinate des Feldes, eine Dimension für die Y-Koordinate und dann noch eine dritte Dimension die nur einen Index von 2 hat, wobei die 0-Ebene verwendet wird um mit true/false zu kennzeichnen ob ein Feld benutzt werden darf oder nicht und die zweite Ebene ("1-Ebene") speichert die Buchstaben der Lösung. Außerdem sollten wir uns ein Array das alle auszufüllenden Lücken enthält generieren.
Was wir als nächstes brauchen ist ein Algorithmus. Am besten wäre wohl ein rekursiver Algorithmus der mit einer Menge an Wörtern und den Informationen der Lücke aufgerufen wird. Er sucht sich nun in einer For-Schleife das erste "passende Wort" aus und ruft sich selbst wieder auf allerdings mit der nächsten Lücke und der Wörter-Menge minus dem eingesetzten wort. Nun werkelt die Rekursion bis entweder die Wörter-Menge leer ist und alle Lücken ausgestopft sind - was bedeutet das wir das Rätsel gelöst haben - oder eine Instanz findet kein "passendes Wort" mehr. Dann bricht diese ab und die Funktion ein Rekursionslevel darüber fährt mit ihrer For-Schleife zum Wörtersuche fort...
Das Problem an der Sache ist nur, dass wir eben noch 2 Methoden benötigen: "Finde alle Lücken" und "passt dieses wort da rein?" Allerdings sollten diese keine Schwierigkeiten bereiten wenn die Daten wie anfangs beschrieben gespeichert werden...
Ich hoffe ich konnte helfen
PS: Wenn du doch an der Uni bist, wieso kannst du so etwas dann nicht selbst? -
Eine Variante mit Schleifen etc. habe ich ja auch bereits gefunden. Aber das ist mir halt zu kompliziert, geht das nicht einfacher?
Ich will Autofahren aber das mit diesem Lenkrad und den Pedalen ist mir halt zu kompliziert, geht das nicht einfacher?
So ungefähr hört sich das an...
Vielleicht solltest du dich erst einmal mit ein zwei Grundlagen Tutorials auseinandersetzen bevor du richtig loslegst. -
Sie dir mal die Hilfe-Einträge und Beispiele zu folgenden Befehlen an:
FileWrite()
GUICreate()
GUICtrlCreateEdit()
GUICtrlCreateInput()
@LF -
NaNaNA, wieso fehlen denn alle Strings in deinem Script?
_IENavigate() navigiert ja - wie der Name schon sagt - eine neue Webseite an und leider hängt das natürlich davon ab wie schnell die Kommunikation zwischen deinem Computer und dem Webserver ist. Ergo lässt sich da nicht viel machen, außer natürlich die Internetverbindung aufstocken... Falls dieser ominöse Webserver überhaupt nicht antwortet, spielt natürlich noch das eingestellte Timeout eine Rolle. Hierzu kannst du dir mal die Methode "_IELoadWaitTimeout()" ansehen. -
Du musst dir nur mal genau überlegen was du da eigentlich vor hast... Du willst aus einer Bild-Datei - die wie du sicher selbst weißt Bildpunkte und die dazu gehörenden Farbinformationen enthält - Text auslesen. Das ist, als ob du mit einer Kamera ein Bild von einer Zeitschrift machst. Woher sol die Kamera wissen ob da text auf dem Bild ist? Die einzige Möglichkeit die besteht ist - wie chesstiger schon gesagt hat - OCR bzw. Texterkennung, dh. eine Software versucht Formen/Muster auf dem Bild zu erkennen um diese dann mit Buchstaben zu vergleichen...
Wie du dir denken kannst ist das ziemlich komplex, aber genau deshalb gibt es ja schon fertige Software-Lösungen die da Abhilfe schaffen.
Wenn du nach Autoit in Verbindung mit OCR/Texterkennung googelst wirst du auf einige Beispiele stoßen - die genau zeigen wie man solche Programme in Autoit verwendet.
Alternativ wäre es natürlich möglich direkt aus den Programmen/Fenstern den Text auszulesen, ohne den Umweg über einen Screenshot zu gehen. -
Erstell dir einfach da wo deine "Buttons" sein sollen Labels. Diesen kannst du dann auch noch den Typischen "Klick-Cursor" zuweisen (GUICtrlSetCursor) und das einizge was du dann noch tun musst, ist zu überprüfen ob auf das Label geklickt wurde...
-
ah ok ja brauchte so was bis jetzt noch nie
Ich auch nicht.