*senfdazugeb*
Genau wie das schon angesprochene Hintergrundrauschen der Soundkarte, kann auch das Rauschen von (abgedunkelten) Kamerasensoren benutzt werden, um Zufallszahlen zu erzeugen. Da dies ein zeitunabhängiger physikalischer Effekt ist, welcher nicht vorausgesagt werden kann, ist das schon ziemlich "zufällig". vgl. atomarer Zerfall.
Übrigens finde ich es interessant, daß bei Zufall automatisch von einer Normal/Gleichverteilung ausgegangen wird! Mal davon abgesehen, daß im Falle eines Zufalls der Zufall keinerlei Ahnung von Statistik hat, ist der Zahlenbereich bzw die Definitionsmenge für das zufällige Ereignis eigentlich nur 0 und 1.
Entweder ein Ereignis passiert, oder eben nicht. Das was wir nun Zufall nennen, ist nur die (beliebig erweiterbare) Folge von Nullen und Einsen, um einen größeren Wertebereich festzulegen.
Im Prinzip geht es um die statistische Wahrscheinlichkeit des Eintretens eines Ereignisses.
Die Zeit(dauer) erscheint uns nur nur deswegen zufällig, weil wir sicher wissen, daß man diesen Faktor (die vergangene Zeit) sicher nicht beeinflussen kann (in der Regel zumindest).
Gleichzeitig beeinflusst die Zeit aber alles andere in unserer Umgebung! Die Zeit beeinflusst gewissermassen alles! Daher bietet sich die Zeit als "Zufallsgenerator" an.
Chaostheorie^^
Wenn man nun davon ausgeht, daß "Zufall" nur eine beliebig (bzw. zufällig) große Folge von Nullen und Einsen ist, dann ist der Computer für die Ermittlung eines Zufalls prädestiniert, denn Nullen und Einsen sind sein Geschäft! Eigentlich muß man nur genügend Nullen und Einsen aus verschiedensten Quellen sammeln um dann irgendwann festzulegen, daß die gesammelte Menge reicht, um herauszufinden, ob mehr Nullen (Ereignis tritt nicht ein) , oder mehr Einsen (Ereignis tritt ein) vorliegen.
Ein schönes Beispiel wäre zzt. die Menge der in der letzten Sekunde von einem Internetknoten weitergeleiteten Datenpakete.
Beiträge von Andy
-
-
...oder per stringformat()
[autoit]for $i=1 to 100
[/autoit]
Consolewrite($i&" "&stringformat("als 3 Ziffern %03s\n", $i))
next -
Habe das selbe Problem. AutoItscript startet Batchdatei. Die Batch kann ich nicht umgehen, da im Kontext der Batchprogramme die Codepage umgeschaltet werden muß. Danach wieder Umschalten auf die ursprüngliche Codepage.
Bisher habe ich auch noch keine andere Lösung gefunden, als die Ausgabe der Programme in der Batch statt in die Konsole mittels > in eine Datei umzuleiten, und dann diese Datei auszuwerten. Nicht sehr schön, aber funktioniert. -
nein, das kommt von tuttifrutti
siehe quelltext
/edit/ ultralangsam....hatte auf autoberts post geantwortet -
Wozu gibt es eigentlich eine Hilfedatei mit funktionierenden Beispielen zu Client/Server?
[autoit]
Dort gibts ein Clientscript und ein Serverscript, welche ohne Änderungen auf jedem Rechner im internen Netz lauffähig sein sollte.
Schritt für Schritt-Anleitung:
A) Beispielscript zuTCPRecv()
[/autoit](das ist der Server) zu einer EXE-Datei kompilieren und diese EXE starten! Ggf die Firewall anweisen, den Server zuzulassen oder ganz abschalten!
[autoit]
B) Beispielscript zuTCPSend()
[/autoit](das ist der Client) auf demselben Rechner starten.Text im Client eingeben, nach einem Enter sollte der eingegebene Text im Serverfenster erscheinen.
Wenn das NICHT so ist, dann ist entweder die Firewall das Problem (abschalten) oder die Netzwerkverbindung. Wenn I-net geht, ist das ein Layer-8-Problem, da hilft dann ab und zu, mehrmals heftigst den Kopf gegen die Türzarge zu schlagen, danach noch mal bei A) anfangen....Sollte die Client/Serververbindung auf dem eigenen Rechner funktionieren, dann kann man anfangen im internen Netz zu testen. Ich gehe davon aus, daß eine funktionierende Netzwerkverbindung besteht, d.h. jeder der Rechner kann den anderen im Netz "sehen" und Daten austauschen.
[autoit]
Dazu die kompilierte SERVER.EXE auf einem anderen Rechner im internen Netzwerk starten, ggf Firewall deaktivieren.
Im Rahmen des Serverfensters erscheint eine IP-Adresse, z.B. 192.168.100.105.
Diese Adresse nun im CLIENT-Script (auf dem lokalen Rechner) in Zeile 18 eintragen:Local $szIPADDRESS = "192.168.100.105"
[/autoit]und Script starten.
Sollte eine Fehlermeldung erscheinen....die Türzarge einige Male heftig mit dem Kopf, ihr wisst schon...das macht wach!
Falls keine Fehlermeldung erscheint, sondern der im Client eingegebene Text im Serverfenster erscheint, gehts weiter, Test im Internet.Dazu ist es zunächst sinnvoll, sich bei einem der DNS-Service-Provider (z.B. DynDNS) eine kostenlose, "personalisierte URL" (z.B. Hoppelhase.dyndns.org) zu besorgen, unter der man dann auch bei wechselnder IP erreichbar ist. Das muss für die ersten Tests nicht unbedingt sein, erleichtert später aber vieles. Diese URL wird z.B. im Router eingetragen und dieser meldet eine vom Internetprovider neu vergebene IP an den DNS Provider. Wenn jetzt jemand eine Verbindung zu eurem Rechner aufbauen möchte, muß er nicht jeden Tag eine andere IP mitgeteilt bekommen, sondern merkt sich nur die URL Hoppelhase.dyndns.org. Diese wird bei einer (automatischen) Anfrage an einen Nameserver dann zu eurer zur Zeit aktuellen IP aufgelöst.
Weiter zum Thema Client/Server-Test im Internet:
Das kompilierte SERVER-Script auf dem lokalen Rechner starten. WICHTIG! Bei Verwendung eines Routers muß dem Router mitgeteilt werden, an welchen Server er die Datenpakete im internen Netz weiterleiten soll! Ist dem Router das Ziel unbekannt, so verwirft er die Daten einfach, und unser Server wartet ewig....
Damit der Router unseren Server "kennt", muß dieser mit (lokaler) IP und dem entsprechenden PORT in eine Liste eingetragen werden. Hat man so etwas noch nie gemacht, ist ein Blick ins Handbuch des Routers angesagt.In der Routerkonfiguration wird man u.U. bei "Port Forwarding" fündig und trägt dort die benötigten Daten ein. Bei meinem Router heißt der Menüpunkt für das forwarding "Firewall Rule".
ACHTUNG! Bei den meisten wird im Router ein DHCP-Serverdienst laufen, welcher den neu angemeldeten Rechnern im internen Netz eine mehr oder weniger zufällige IP-Adresse zuteilt! Daher sollte man, wenn man Serverdienste (HTTP/FTP/AutoIt-Server) im Internet bereistellt, dem Rechner, auf dem dieser Serverdienst läuft, eine FESTE IP-Adresse zuteilen. Ansonsten muß man u.U. täglich mehrmals seinen Router umkonfigurieren, damit dieser immer die aktuelle IP des Server-Rechners hat, und wer will das schon....
Für das "Port forwarding" gibt es jede Menge Anleitungen, falls es nicht klappt....Kopf....Türzarge....BÄÄÄÄM....das klärt den Blick!Damit der Client sich mit dem Server verbinden kann, muss man die IP-Adresse des Servers (bzw. des Routers auf der Serverseite) herausfinden. Am einfachsten geht das, indem man VOM SERVER AUS eine Seite im Internet, wie z.B. https://autoit.de/www.wieistmeineip.de aufruft. Die dort angezeigte IP ist idR die IP, unter der der Router des Servers erreicht wird. Diese IP wird dann im CLIENT-Script in Zeile 18 eingetragen. Wie die dorthinkommt? Na per Email, SMS, Telefon, Briefpost, Aufschreiben und hintragen oder wie auch immer.....
Das ist der Grund für das Einrichten einer URL (Hoppelhase.dyndns.org) bei einem DNS-Service-Provider. Dann muss man ins Clientscript statt der ServerIP nur Hoppelhase.dyndns.org eintragen, und bei einer Verbindung wird (nach automatischer Anfrage an den DNS) die "richtige", d.h zzt. aktuelle IP des Routers auf der Serverseite genutzt.
Der Client muss den Router NICHT umkonfigurieren! In der Regel lässt ein Router alles von drinnen nach draussen durch! Eine Firewall blockiert auch (normalerweise) diesen Weg, daher im Zweifelsfall ausschalten.Wenn nun Serverseitig richtig "geforwardet" ist, sämtliche IP-Adressen stimmen und die Türzarge endlich aus Kleinholz besteht, dann sendet auch der Client fleissig seine Daten ohne Probleme an den Server!
Wenn das alles funktioniert, DANN und erst DANN werden Scripte um/neu-geschrieben und auf eigene Bedürfnisse angepasst....und wenn die dann nicht funktionieren, dann liegt das nicht an der Technik, sondern am Unvermögen des Coders oder dessen Lernresistenz! In der Hilfe steht alles wichtige, weiterhin gibts massig funktionierende Scriptbeispiele. Somit gibt es keinen Grund mehr, "TCPIP funktioniert nicht"-Threads aufzumachen! -
hihi, hab mein eigenes garnicht in der Aufstellung dabeigehabt. Das benutzt die DOS-Programme DIR und FIND und schlägt selbst Tweakys Script bzgl Geschwindigkeit.
Falls man öfter Dateien bzw Inhalte suchen sollte, bietet sich an, per Script alle paar Tage (Stunden) sämtliche Platten nach den vorhandenen Dateinamen zu scannen und diese Liste in eine Datei zu schreiben. Innerhalb dieser Liste ist eine gesuchte Datei dann wesentlich schneller gefunden, als über den Windows-Index(obwohl der genau das eigendlich machen sollte). -
Hi, habe mal einige Funktionen zusammengetragen
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$pfad = @scriptdir;"c:";@WindowsDir$begin1 = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
$dateien1 = _ordner_rekursiv($pfad, 1)
$dif1 = TimerDiff($begin1)
ConsoleWrite("Tweaky" & @TAB & Round($dif1 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien1) - 1 & @CRLF)$begin2 = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
$dateien2 = _GetFilesFolder_Rekursiv($pfad, '*', 0)
$dif2 = TimerDiff($begin2)
ConsoleWrite("BugFix" & @TAB & Round($dif2 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien2) - 1 & @CRLF)$begin3 = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$dateien3 = _RecursiveFileListToArray($pfad, '.pdf', 1)
_arraydisplay($dateien3)
$dif3 = TimerDiff($begin3)
ConsoleWrite("Oscar" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF);===============================================================================
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Function Name: _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
; einem RegExp-Pattern entsprechen
; Parameter(s): $sPath = Startverzeichnis
; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
; $iFlag = Auswahl
; 0 = Dateien & Verzeichnisse
; 1 = nur Dateien
; 2 = nur Verzeichnisse
; $iFormat = Rückgabeformat
; 0 = String
; 1 = Array mit [0] = Anzahl
; 2 = Nullbasiertes Array
; $sDelim = Trennzeichen für die String-Rückgabe
; Requirement(s): AutoIt 3.3.0.0
; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
; Author(s): Oscar (http://www.autoit.de)
; Anregungen von: bernd670 (http://www.autoit.de)
;===============================================================================
Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
Local $hSearch, $sFile, $sReturn = ''
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
If @error Or $hSearch = -1 Then Return SetError(0, 0, $sReturn)
While True
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
$sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
ContinueLoop
EndIf
If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
WEnd
FileClose($hSearch)
If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
Return $sReturn
EndFunc#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <File.au3>;*******************************************************************************************************************************************************************************************************************************************
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Funktion _ordner_rekursiv($udf_quellordner[, $udf_Ordner_Dateien[, $udf_unterordner=False[, $udf_spalte_datum [, $udf_dateityp = "*"[, $udf_auslassen = ""]]]]])
; Beschreibung ermittelt alle Dateien/Ordner des angegebenen Verzeichnisses
; Parameter $udf_quellordner: der zu durchsuchende Ordner (Angabe: einzelner Ordner als String oder mehrere Ordner im Array beginnend bei 1)
; optional $udf_Ordner_Dateien: 1 = Dateien auflisten (Standard) 2 = Ordner auflisten
; optional $udf_unterordner: True = Unterordner nicht miteinbeziehen (Standard) False = Unterordner nicht miteinbeziehen
; optional $udf_spalte_datum: True = Änderungsdatum der Datei ermitteln False = Änderungsdatum der Datei nicht ermitteln (Standard)
; optional $udf_dateityp: einzuschließende Dateitypen (mehrere Typen durch | trennen) "*" >>> alle (Standard)
; optional $udf_auslassen: Wörter, die im Pfad oder Dateinamen vorkommen, auslassen (mehrere durch | trennen) "" <<< Standard
; Rückgabewert Erfolg: Gibt ein Array mit 3 Spalten zurück (Dateiname, Dateipfad, Änderungsdatum)
; Fehler: 0 setzt @error
; @error = 1 mindestens 1 Pfad existiert nicht
; Autor Tweaky (http://www.autoit.de)
;*******************************************************************************************************************************************************************************************************************************************;********************************************
[/autoit] [autoit][/autoit] [autoit]
; Ordner rekursiv (Hauptfunktion) *
;********************************************Func _ordner_rekursiv($udf_quellordner, $udf_Ordner_Dateien = 1, $udf_unterordner = True, $udf_spalte_datum = False, $udf_dateityp = "*", $udf_auslassen = "")
[/autoit] [autoit][/autoit] [autoit]
Local $verzeichnisse_alle[1] ;Array für die Ordner
Local $array_alles[1000000][3] ;Array für die Ordner und Dateien
Local $szDrive, $szDir, $szFName, $szExtIf Not IsArray($udf_quellordner) Then
[/autoit] [autoit][/autoit] [autoit]
$udf_quellordner_tmp = $udf_quellordner
Dim $udf_quellordner[2]
$udf_quellordner[1] = $udf_quellordner_tmp
EndIfFor $i = 1 To UBound($udf_quellordner) - 1
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($udf_quellordner[$i]) Or Not StringInStr($udf_quellordner[$i], ":") Then
SetError(1)
Return 0
EndIfIf StringRight($udf_quellordner[$i], 1) <> "\" Then $udf_quellordner[$i] &= "\"
[/autoit] [autoit][/autoit] [autoit]$udf_quellordner_einzeln = $udf_quellordner[$i]
[/autoit] [autoit][/autoit] [autoit]If $udf_unterordner = True Then ;mit Unterordner
[/autoit] [autoit][/autoit] [autoit]
_ordner_rekursiv_mit_unterordner($udf_quellordner_einzeln, $verzeichnisse_alle)
_ArrayAdd($verzeichnisse_alle, $udf_quellordner_einzeln)
Else ;ohne Unterordner
$verzeichnisse_alle = $udf_quellordner
EndIf
NextIf IsArray($verzeichnisse_alle) Then $verzeichnisse_alle[0] = UBound($verzeichnisse_alle) - 1 ;In die erste Zeile die Anzahl der Dateien schreiben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If $udf_Ordner_Dateien = 1 Then ;Dateien auflisten
[/autoit] [autoit][/autoit] [autoit]
$zaehler_fortlaufend = 0If Not IsArray($verzeichnisse_alle) Then
[/autoit] [autoit][/autoit] [autoit]
$verzeichnisse_alle_tmp = $verzeichnisse_alle
Dim $verzeichnisse_alle[2]
$verzeichnisse_alle[1] = $verzeichnisse_alle_tmp
EndIfFor $u = 1 To UBound($verzeichnisse_alle) - 1
[/autoit] [autoit][/autoit] [autoit]
$array_alle_dateien = _FileListToArray($verzeichnisse_alle[$u], "*", 1)For $k = 1 To UBound($array_alle_dateien) - 1
[/autoit] [autoit][/autoit] [autoit]
$kriterien_ok = 0If $udf_dateityp = "*" Then ;Dateityp nicht angegeben oder alle Dateien
[/autoit] [autoit][/autoit] [autoit]
$kriterien_ok = 1ElseIf StringInStr($udf_dateityp, "|") Then ;Dateitypen angegeben
[/autoit] [autoit][/autoit] [autoit]
$dateityp_split = StringSplit($udf_dateityp, "|")
$udf_dateiendung_array = _PathSplit($array_alle_dateien[$k], $szDrive, $szDir, $szFName, $szExt)
$udf_dateiendung = $udf_dateiendung_array[4]
For $i = 1 To UBound($dateityp_split) - 1
If "." & $dateityp_split[$i] = StringRight($array_alle_dateien[$k], StringLen($udf_dateiendung)) Then
$kriterien_ok = 1
ExitLoop
EndIf
Next
EndIfIf $udf_auslassen <> "" Then ;Wörter in dem Pfad und Datei auslassen
[/autoit] [autoit][/autoit] [autoit]
$auslassen_split = StringSplit($udf_auslassen, "|")
For $i = 1 To UBound($auslassen_split) - 1
If StringInStr($array_alle_dateien[$k], $auslassen_split[$i]) Or StringInStr($verzeichnisse_alle[$u], $auslassen_split[$i]) Then
$kriterien_ok = 0
ExitLoop
EndIf
Next
EndIf;Papierkorb und System Volume Information wird nicht mitkopiert
[/autoit] [autoit][/autoit] [autoit]
If StringInStr($array_alle_dateien[$k], 'RECYCLER') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLER') _
Or StringInStr($array_alle_dateien[$k], 'RECYCLED') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLED') _
Or StringInStr($array_alle_dateien[$k], 'System Volume Information') Or StringInStr($verzeichnisse_alle[$u], 'System Volume Information') _
Or StringInStr($array_alle_dateien[$k], '$RECYCLE.BIN') Or StringInStr($verzeichnisse_alle[$u], '$RECYCLE.BIN') Then
$kriterien_ok = 0
ExitLoop
EndIf;wenn der Dateityp passt und die Datei bzw. der Ordner nicht ausgelassen werden soll
[/autoit] [autoit][/autoit] [autoit]
If $kriterien_ok = 1 Then
$zaehler_fortlaufend += 1
$array_alles[$zaehler_fortlaufend][0] = $verzeichnisse_alle[$u]
$array_alles[$zaehler_fortlaufend][1] = $array_alle_dateien[$k]If $udf_spalte_datum = True Then
[/autoit] [autoit][/autoit] [autoit]
$time2 = FileGetTime($verzeichnisse_alle[$u] & "\" & $array_alle_dateien[$k], 0) ;"Datum geändert" auslesen
$array_alles[$zaehler_fortlaufend][2] = $time2[0] & $time2[1] & $time2[2] & $time2[3] & $time2[4] & $time2[5]
EndIfEndIf
[/autoit] [autoit][/autoit] [autoit]Next
[/autoit] [autoit][/autoit] [autoit]
NextElse ;Ordner auflisten
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To UBound($verzeichnisse_alle) - 1
$array_alles[$i][0] = $verzeichnisse_alle[$i]
$zaehler_fortlaufend = UBound($verzeichnisse_alle) - 1
Next
EndIf;Leere Zeilen am Ende löschen
[/autoit] [autoit][/autoit] [autoit]
ReDim $array_alles[$zaehler_fortlaufend + 1][3];In die erste Zeile die Anzahl der Dateien schreiben
[/autoit] [autoit][/autoit] [autoit]
If IsArray($array_alles) Then $array_alles[0][0] = UBound($array_alles) - 1$verzeichnisse_alle = 0
[/autoit] [autoit][/autoit] [autoit]Return $array_alles
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ordner_rekursiv;**************************************
[/autoit] [autoit][/autoit] [autoit]
; Unterordner durchsuchen *
;**************************************Func _ordner_rekursiv_mit_unterordner($udf_quellordner, ByRef $verzeichnisse_alle)
[/autoit] [autoit][/autoit] [autoit]
$verzeichnisse = _FileListToArray($udf_quellordner, "*", 2)For $i = 1 To UBound($verzeichnisse) - 1
[/autoit] [autoit][/autoit] [autoit]
$verzeichnisse[$i] = $udf_quellordner & $verzeichnisse[$i] & "\"
_ArrayAdd($verzeichnisse_alle, $verzeichnisse[$i])
_ordner_rekursiv_mit_unterordner($verzeichnisse[$i], $verzeichnisse_alle)
Next
EndFunc ;==>_ordner_rekursiv_mit_unterordner;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
; optional: $iRetType 0 gibt Array, 1 gibt String zurück
; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
Global $oFSO = ObjCreate('Scripting.FileSystemObject')
Global $strFiles = ''
Switch $sDelim
Case '1'
$sDelim = @CR
Case '2'
$sDelim = @LF
Case '3'
$sDelim = ';'
Case '4'
$sDelim = '|'
Case Else
$sDelim = @CRLF
EndSwitch
If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
If $sExt = -1 Then $sExt = '*'
If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
_ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
If $iRetType = 0 Then
Local $aOut
$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
If $aOut[1] = '' Then
ReDim $aOut[1]
$aOut[0] = 0
EndIf
Return $aOut
Else
Return StringTrimRight($strFiles, StringLen($sDelim))
EndIf
EndFuncFunc _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
[/autoit]
If Not IsDeclared("strFiles") Then Global $strFiles = ''
If ($Dir = -1) Or ($Dir = 0) Then
For $file In $Folder.Files
If $Ext <> '*' Then
If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
$strFiles &= $file.Path & $Delim
Else
$strFiles &= $file.Path & $Delim
EndIf
Next
EndIf
For $Subfolder In $Folder.SubFolders
If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
Next
EndFunc -
Hab das gerade mal getestet, funktioniert einwandfrei mit Openoffice.
Tabelle erstellt und als pdf gespeichert.
Per AutoIt-Shellexecute das pdf öffnen, ctrl+a markiert die Tabelle im pdf, Daten mit ctrl-c in die Zwischenablage oder sonstwohin (textfile).
In OO-Calc per ctrl-v einfügen führt zur Abfrage nach Trennzeichen, dort "Leerzeichen" anklicken (lassen), fertig.
Allerdings werden die Textformatierungen (Fett usw) nicht mit aus dem PDF übernommen, ausschliesslich der reine (Tabellen)Text. -
Hi,
beim Foxit Reader ist ein Textviewer dabei, der aus einer Tabelle einen Fließtext macht, ggf hilft dir das weiter./edit/ dieses VB-Macro gerade bei google gefunden, das an AutoIt anzupassen sollte ja mit der excel-udf nicht schwer sein
[autoit]Option Explicit
[/autoit][autoit][/autoit][autoit]Sub Versuch_SendKey()
[/autoit][autoit][/autoit][autoit]
'pdf-Programm:
Const strPdfProgNam As String = "C:\...\AcroRd32.exe"
'pdf-Datei:
Const strPdfNam As String = "G:\...\Datei.pdf"
If ActiveSheet.Cells(1, 1) <> "" Then
Exit Sub
End If'pdf öffnen
[/autoit][autoit][/autoit][autoit]
Shell """" & strPdfProgNam & """ """ & strPdfNam & """", vbNormalFocus
'Zwischenablage:
SendKeys "^a", True
SendKeys "^c", True
'pdf Schließen:
SendKeys "%{F4}"
'In Excel-Tabellenblatt einfügen
ActiveSheet.PasteEnd Sub
[/autoit] -
24 Postings und immer noch weiß niemand was der TE eigentlich machen möchte, eins hab ich aber verstanden:
ZitatZ.b. auf dem Desktop mit dem namen test könnt ihr mir das schreiben.
Übersetzt: "Leg mir mal einer den Arm aus der Sonne...."
Falsches Forum würde ich sagen!
Ich bin dafür, solche Threads nicht nur zu schließen, sondern komplett zu löschen! -
Hi,
ein Bekannter macht relativ viel mit Arduino, als großen Vorteil sieht er die Community und die schon fertigen Module, sehr praktisch für z.B. den Modellbau.
http://www.freeduino.de/books/arduino-tutorial-lady-ada
Bsp. Bauteile:
http://www.watterott.com/index.php?xc84a3=nskj289cm93g9pg7j1al42ph05&page=search&keywords=arduino&x=0&y=0 -
Beim Auswerten der "Laufzeiten" sollte man sich bei AutoIt keine großen Gedanken machen. Einige Zehntelsekunden bzw. sogar Sekunden mehr oder weniger bei den einzelnen Durchläufen sind völlig normal. AutoIt bietet auch keinerlei Möglichkeiten, diese Streuung zu vermeiden.
Festplattenaktivitäten im Hintergrund sind generell für die Ausführungsgeschwindigkeit von AutoIt-Scripten störend. Weiterhin bemerkt man deutlich bei Datenbewegungen, ob diese im Cache gelegen haben. Apropos Cache, beim Experimentieren mit dem Assemblercode habe ich Geschwindigkeitssteigerungen von Faktor 100 (ja, das heisst 100x schneller) beim identischen Rechenalgorithmus festgestellt. Wenn man das bei AutoIt "einstellen" könnte wie z.B. bei einigen C-Compilern und seinen Algorithmus auf die Hardware (z.B. Cache) anpasst, werden die in AutoIt "langsamen" Algorithmen (komprimierte Siebe z.B. Atkin) plötzlich x-mal schneller als die bisher schnellen, "normalen" Algorithmen.Fazit: Zum schnellen "Rechnen" ist AutoIt nur sehr bedingt zu gebrauchen, da reißen auch schnell(st)e Algorithmen nichts raus! Wer Rechengeschwindigkeit braucht, setzt "richtige" Compiler ein und/oder schreibt damit eine per AutoIt verwendbare DLL!
Dann wird aus einem Mofafahrer(AutoIt) bei Verwendung von C(++) ein Hayabusa-Fahrer. Aber selbst darüber kann ein Jetpilot, der mit Mach2 (C mit Hardwareoptimierung, s. Link) durch die Atmosphäre brettert, nur müde lächeln
Schönes Beispiel: http://primzahlen.de/files/referent/kw/sieb.htm -
oder so.....
Spoiler anzeigen
[autoit]#include <Date.au3>
[/autoit] [autoit][/autoit] [autoit]$startzeit = "2010/06/19 09:22:06" ;YYYY/MM/DD HH:MM:SS Zeitpunkt, bei dem eine Aktion gestartet werden soll
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$differenz = _DateDiff("s", $startzeit, _NowCalc()); differenz zwischen aktueller Zeit und Startzeit
Sleep(1000) ;eine Sekunde warten
ToolTip("Noch " & - $differenz & " Sekunden..") ;restliche Sekunden anzeigen
Until $differenz > 0 ;solange die Startzeit noch nicht erreicht ist, Schleife wiederholen
ToolTip("")
;Aktion auslösen
MsgBox(0, "Startzeit " & $startzeit & " erreicht oder überschritten!", _NowCalc());kürzer ohne Anzeige der Sekunden
[/autoit] [autoit][/autoit] [autoit]
While _DateDiff("s", $startzeit, _NowCalc()) < 0 ;schleife so lange durchlaufen, bis Startzeit erreicht oder überschritten ist
Sleep(1000) ;eine Sekunde warten
WEndMsgBox(0, "Startzeit " & $startzeit & " erreicht oder überschritten!", _NowCalc())
[/autoit]
Das funktioniert dann auch, wenn der Rechner zwischendurch runtergefahren bzw. neugestartet wurde -
-
Die Infos bekommt man da, wo man eigentlich alle Infos herbekommt^^ MSDN
z.B. http://msdn.microsoft.com/en-us/library/…ipboard_FormatsAber diese Arbeit habe ich mir ehrlich gesagt nicht gemacht. Datei im Explorer markieren, ctrl+c.
Eine for/to Schleife und alle Rückgaben von _ClipBoard_GetData() ausgeben lassen und diese nach dem Dateinamen durchsuchen, voila, der Rest ist Stringmanipulation. -
hm, seltsam, ich bekomme überall
\\rechnername\laufwerk\pfad\dateiname -
@progandy
/EDIT/ Erledigt, hatte UTF versaubeutelt....manchmal sollte man nachts schlafen...dann kommt auch im Gehirn an, was das Auge sieht!....veronesi
auf allen Freigaben im Netz bekomme ich den UNC-Pfad zurück. Wenn du auf der lokalen Maschine arbeitest, dann werden allerdings auch die lokalen Dateinamen zurückgegeben. Aber wo ist das Problem, die Rückgabe am Anfang auf \\ zu testen und dann den Servernamen davorzuhängen? Zu deinen Fragen:- Ich habe mir jetzt nicht das Format angeschaut, aber der Dateipfad fängt erst ab dem 20. Zeichen (des Ursprungsstrings) an. Daher mit stringtrim() abschneiden.
- Strings werden allgemein üblich nullterminiert, d.h. das Nullbyte zeigt der anzeigenden Funktion (z.B. der Messagebox oder Consolewrite), daß der String hier zu Ende ist. Tatsächlich kann der string aber viel länger sein, er wird aber nur bis zum ersten Nullbyte dargestellt. Auch die AutoIt-Stringfunktionen juckt das Nullbyte irgendwo in der Mitte des Strings nicht, Ausnahme ist stringregexp(), aber wofür gibts stringtobinary()?^^ -
Den Dateinamen zu markieren wirst du mit ctrl+c hinbekommen. Dann per
[autoit]$dateiname=Stringreplace(stringtrimleft(binarytostring(_ClipBoard_GetData(15)),20),chr(0),"")
[/autoit]auslesen. Klappt unter XP32, bitte mal unter anderen BS testen...
-
Wenn das Patchen der EXE kein Problem ist, wieso machst du dann kein Auswahlmenü rein?
Das sind nur einige Zeilen Code, die du an das Ende der EXE anhängen müsstest, 1x Sprungadressen umbiegen, fertig. Seit es dieses Dateiformat gibt, wird das so gemacht....
Mal abgesehen von der schon von Pee angesprochenen Sinnhaftigkeit eine EXE zu patchen (was glaubst du wie lange die Spielehersteller das erlauben werden?) ist das Thema "AutoIt" hier völlig aussen vor. Vote for close.... -
Ja,
du kannst natürlich Texte in einer ausführbaren Datei ändern, das ist auch mit AutoIt überhaupt kein Problem.
Das Problem, die Texte in der EXE direkt zu ändern besteht darin, daß du nur mit gleich langen oder kürzeren Texten ersetzen kannst. Bei z.B. Pfaden sollte man das beachten!
Ob du den Pfad im Ram änderst oder direkt in der Datei, bleibt gleich. Datei ändern ist wesentlich einfacher.
Das ändern im Ram ist dann genauso einfach möglich, wenn du die Einsprungpunkte (Adressen) kennst. Um mehr zu erfahren, solltest du dich mit dem PE-Format (http://www.microsoft.com/whdc/system/pl…are/PECOFF.mspx) auseinandersetzen. Dort ist das Format erklärt, für eine Anwendung in AutoIt solltest du im engl. Forum nach "Subrogation" suchen.Ich verstehe nicht was du mit Nomad vorhast, die 08/15 Stringbefehle von Autoit reichen doch vollkommen aus um deinen gesuchten String im Ram zu finden und abzuändern?