Protex hat Recht ...
Wenn du am Ende des Programs ein Program starten willst und du keine Ahnung hast, wohin du einen Befehl schreiben sollst der am ENDE ausgeführt werden soll ...
Dann ... findet das kein ENDE ....
BLinz
Protex hat Recht ...
Wenn du am Ende des Programs ein Program starten willst und du keine Ahnung hast, wohin du einen Befehl schreiben sollst der am ENDE ausgeführt werden soll ...
Dann ... findet das kein ENDE ....
BLinz
Moin,
schau mal hier: [ gelöst ] Drucker für den angemeldeten Benutzer über WMI abfragen.
Moin,
Das klingt ja nach einer "Rückgängig" Funktion ... nein im Ernst ..
Ich löse dies indem ich meine Werte, Berechnungen etc halt in Zwischenvariablen mache - und erst ganz am Ende der Funktion wenn alles Glatt gelaufen ist, übertrage ich die Werte in die eigentlichen..
Mhh, ich hoffe der Satz ist verständlich ...
Wen ich mit vielen Funktionen arbeite nutze ich eine Globale Variable um einen Fehler (oder einen Abbruch des Benutzers) über alle Funktionen zu erkennen.
Ich setzte als am Anfang ein
$bAllesOK = True
[/autoit]
Wenn eine Komponente einen Fehler hat setzt sie diese auf "False".
Vor allen wichtigen Sachen, am Anfang von Funktionen etc prüfe ich zuvor die $bAllesOK.
Am Ende des Abschnitts gebe ich dann die Rückgabewerte wenn alles ok ist - oder eben nicht. Kann auch nocht um fehlertext ergänzt werden
BLinz
Also,
warum auch immer hat das Original Script bei mir auch gezickt.
Der Hänger kam bei mir meine ich von der letzten _ftp_close($ftpconnect) - die ist zuviel oder?
Ich habe auf dem FTP beim hochladen zugesehen an sich ging es - aber ich hatte den Zieldateinamen um ein "/" ergänzt. (siehe auch unten)
Ich habe dein Script mal wie folgt geändert:
[autoit]#include <FTPEx.au3>
#include <Misc.au3>
$datei_pfad = FileOpenDialog("Datei auswählen", "", "Alle (*.*)|Ausführbare (*.exe)")
[/autoit][autoit][/autoit][autoit]For $i = 1 To StringLen($datei_pfad)
$stringright = StringRight($datei_pfad, $i)
$stringtrim = StringTrimRight($stringright, $i - 1)
If $stringtrim = "\" Then
$file_name_rew = $stringright
ExitLoop
EndIf
Next
$file_name = StringTrimLeft($file_name_rew,1)
[/autoit][autoit][/autoit][autoit];MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$file_name' & @lf & @lf & 'Return:' & @lf & $file_name) ;### Debug MSGBOX
[/autoit][autoit][/autoit][autoit]$ftpopen = _Ftp_open("myftp")
[/autoit][autoit][/autoit][autoit]$ftpconnect = _FTP_Connect($ftpopen, 'znil.de', "username", "test1234")
[/autoit][autoit][/autoit][autoit]_FTP_ProgressUpload($ftpconnect, $datei_pfad, "/" & $file_name, "_UpdateProgress")
[/autoit][autoit][/autoit][autoit]_ftp_close($ftpopen)
[/autoit][autoit][/autoit][autoit];_ftp_close($ftpconnect)
[/autoit][autoit][/autoit][autoit]Func _UpdateProgress($Percentage)
ConsoleWrite("Fortschritt: " & $Percentage & "%" & @CRLF)
Return 1 ; Upload fortsetzen
Endfunc
Statt _ftp_fileput nehme ich _FTP_ProgressUpload. Funktioniert gleich, kann aber über den Fortschritt unterrichten.
Die Funktion schreibt unten in die Ausgabe von Scite oder in die DOS Box je eine Zeile pro erreichten %
Beim $file_name habe ich ein "/" davor gesetzt, sonst zickt mein FTP rum.
BLinz
Ich probier sein Programm mal nacher mal an meinem FTP Server aus - ich schreibe gerade selbst einen FTP-Uploader, sollte als im "Stoff" stehen.
So, erst einmal nach Hause :wacko:
Moin,
versuch mal
[autoit]Func _Encodefile($string)
If $string = "" Then Return ""
Local $sfa
$len = StringLen($string)
$a = StringToASCIIArray($string)
for $c = 0 to $len -1
Switch hex($a[$c])
Case 00
$a[$c] = 55
Case 01
$a[$c] = 54
Case 02
$a[$c] = 57
;...usw bis 255
Next
Return _ArrayToString($a)
EndFunc
Switch ist sehr viel schneller als If Then - und du wandelst nur 1x Hex()
BLinz
Hallo Emperormatem
ich würde vorschlagen du probierst auch mal einen anderen FTP aus - wenn es dem gerade liegt suchts du dir einen Wolf.
bzw. teste mal mit einem normalen FTP Programm wie WinSCP ob alles funktioniert.
Beruflich nutze ich FTP viel - und kürzlich erst einen der sich nicht mit einer bestimmten Software nutzen lies.
BLinz
Das Problem könnte sein das die Benutzer - im Beispiel von ebay - ja nie ebay.de aufrufen.
Sondern http://www.ebay.de/
Deine neue Zone sollte nicht "de" sondern "ebay.de" heissen - dann denkt windows das es für alle der domäne ebay.de zuständig ist.
Nur eine Zone DE sollte nicht funktionieren - denn es wäre keine richtige DNS Zone (und die besteht aus Domain.Suffix)
Da kannst du ja noch einen Hosteintrag für "www." machen
Was ist an weiterleitungen auf dem DNS konfiguriert? Du kannst bedingte weiterleitungen konfigurieren, also z.B. nur weiterleiten wenn die domäne "ebay.de" gefordert wird - und das dann ins Nirvana.
Und die HOST datei ist noch nicht tot - sie ist einer der schnellsten und einfachsten wege für do etwas. Die DNS Lösung kennt nämlich keine Ausnahmen und gilt immer für alle Rechner.
BLinz
(gibt nach 45 Minuten Fehlersuche auf)
So,
ich hab meine Funktion auf einen Einzeiler(!) gekürzt, dank der kleinen Lehrstunde von i2c:
[autoit]#include <String.au3>
[/autoit][autoit][/autoit][autoit]Func _AddThousandDotNEU($iZahl)
Return StringRegExpReplace(_StringReverse(StringRegExpReplace(_StringReverse($iZahl),"\d{3}","\0.")),"(?<![0-9])\.","",1)
EndFunc
MsgBox(0,"Formatierte Zahlen",_AddThousandDotNEU(1234567890) & @CRLF & _AddThousandDotNEU(111222333))
[/autoit]Am "(?<![0-9])\." musste ich ein wenig herumprobieren - warum ging es nicht mit "(?<!\d*)\." ? Ist \d nicht erlaubt in den ( ) ?
BLinz
09.11.2011 / 15:15: Habe die vergessende Include Anweisung noch nachgetragen (Danke Oscar)
Nachtrag: Kleine Erklärung für Leute wie mich (vor 2h):
Danke Chip, die hatte ich auch gefunden - aber die war mir zu ... kompliziert / groß für ein paar Punkte in den Zahlen
So, zu i2c ...
Ähm (Kopf kratz)
mal sehen:
Zeile 4:
[autoit]$Dec = StringRegExp($Test, "\,\d*", 1)
[/autoit]
\, = wir suchen ein Komma, und da ein Komma ein Sonderzeichen ist müssen wir es maskieren ....
\d* = findet alle Ziffern
1 = Gibt ein Array zurück ... mit der ersten Übereinstimmung ... [nachdenk] ... ein Array mit nur einem Wert?
mhh also ein Array das alle Nachkommastellen inklusive des Kommas enthält?
Zeile 5:
[autoit]$Test = StringRegExpReplace($Test, "\,\d*", "")
[/autoit]
wir ersetzen in unerser $Test wie folgt:
\, = die Kommas
\d* = und alle Zahlen
durch "" , also nichts. mmh wozu? ... Moment - oben haben wir die Nachkommastellen herausgesucht mit dem selben Suchstring .... dann schneiden wir hier die Nachkommastellen ab!
Zeile 6:
[autoit]$Test = StringRegExpReplace(_StringReverse($Test), "\d{3}", "\0.")
[/autoit]
Wir drehen unseren $Test String um und ersetzen
\d{3} = 3 aufeinanderfolgende Zahlen?
durch
\0. = finde ich nicht in der Hilfe, ich vermute "die 3 aufeinanderfolgenden Zahlen + ein Punkt" ?
Zeile 7:
Wenn $Dec, welcher zu diesem Zeitpunkt ein Array mit den einzelnen zahlen ist ...dann Zeile 8
Zeile 8:
[autoit]$Result = _StringReverse($Test) & $Dec[0]
[/autoit]
Dann ist $Result
$Test wieder Rückwärts -> 2 mal Rückwärts wäre wieder vorwärts
und daran hängen wir ... die Nachkommastellen die wir in Zeile 4 herausgesucht haben ....
Klar, Zeile 10 ist für den Fall das $Dec kein Array ist - was bedeutet das es keine Nachkommastellen gab ...
Und Zeile 12 dient für den Fall das er uns einen führenden Punkt gesetzt hat, z.B. bei 6-stelligen Zahlen ...
PUHHHHHHHH
Ich glaube ich habs verstanden - nur dem "\0." noch nicht ....
ZitatDer Text, der den gefundenen Text des regulären Ausdrucks ersetzen soll. Es können auch Gruppentext wie z. B. \0 - \9 (oder $0 - $9) als Rückverweise verwendet werden
Also Rückverweis ... das Ergebnis der Suche ... "\d{3}" ... die 3 aufeinanderfolgenden Zahlen?
Und StringRegExpReplace ersetzt nicht nur einmal sondern jedesmal wenn er 3 Zahlen finden bis zum Ende des Strings?
Mhh, habe ich es richtig verstanden? Wenn ja, dann glaube ich wird "StringRegExpReplace" mein neuer Liebling ....
BLinz
Es heist übrigens nicht Auto IT. Dann kommt bald wieder einer und registriert sich hier, weil er denkt es ginge um Informationtechnik in der Automobilwelt.
ist mir am Anfang als alter IT'ler auch passiert
BLinz
Moin Moin,
für aktuelles Projekt brauchte ich eine Funktion zur Formatierung von Zahlen.
Konkret wollte ich Tausender-Trennzeichen, also statt
123456789 wollte ich 123.456.789
Ich habe ein wenig die Suche hier gequält und die "_StringAddThousandsSep" Funktion gefunden ... die aber nicht mehr bei AutoIt dabei ist - und die sah mir doch zu übertrieben aus.
Naja, meine Lösung funktioniert, es geht aber ja wahrscheinlich viel eleganter oder?
Ich habe mir zwar die Hilfe von "StringRegExpReplace" angesehen ... aber ganz ehrlich, das mit den Suchausdrücken und den geschweiften Klammern habe ich nicht verstanden ...
Naja, hier meine Version:
#include <array.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _AddThousandDot($iZahl)
Local $aZahl[1] ; Array
Local $sZahl ; String
Local $iZaehler ; Integer
$sZahl = String($iZahl) ; Ersteinmal in einen String wandel
If $sZahl = "" Then ;Ups, das Ding war leer!
SetError(1)
Return 1
EndIf
;Nun bauen wir ein Array
; $aZahl[0] enthält die Anzahl der Elemente
; $aZahl[x] die jeweilige Stelle
For $i = 1 To StringLen($sZahl) Step 1
_ArrayAdd($aZahl,StringMid($sZahl,$i,1))
$aZahl[0] = $aZahl[0] + 1
Next
$iZaehler = 0
$sZahl = ""
;Nun bauen wir die Zahl Rückwärts wieder zusammen
For $i = $aZahl[0] To 1 Step -1
$iZaehler = $iZaehler + 1 ; Stellen mitzählen!
$sZahl = $aZahl[$i] & $sZahl
If $iZaehler = 3 And $i <> 1 Then ;Hui, die dritte Stelle - aber nicht die letzte!
$sZahl = "." & $sZahl ; einen Punkt dazu
$iZaehler = 0 ; und neu mit Zählen anfangen
EndIf
Next
Return $sZahl
EndFunc
MsgBox(0,"ACHTUNG!","Gleich geht es los - diese Fenster dient nur dem Zweck" & @CRLF & _
"das das Script vollständig geladen wird bevor die Funktion aufgerufen wird")
MsgBox(0,"Formatierte Zahlen",_AddThousandDot(1234567890) & @CRLF & _AddThousandDot(111222333))
Exit
Ich freue mich jetzt schon auf die kürzeste Lösung
BLinz
Also,
ich hab mir einen kleinen Testkanditaten gebaut der erst eine Datei mit 500.000 Zeilen anlegt,
diese dann Zeile für Zeile einliest, ggf. einen String ersetzt und in eine zweite Datei schreibt:
Meine Zeiten:
Datei anlegen in 4 Sekunden
Datei einlesen, ändern, in 2. Datei schreiben: 14 Sekunden
und mein Rechner ist jetzt nicht so schnell / neu. Das ganze direkt im Editor unkompiliert (falls das was ausmacht)
Hier mein Testprogramm:
#Include <Array.au3>
Dim $arrayTexte[5] = ["Meine Statistic blablablabla blablabla blablablabla blablablabla blablablabla blablablabla blablablabla", _
"Meine RunningTime asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag", _
"nur so ein Text asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag", _
"noch ein weiterer Text asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag", _
"Und eine weitere langweilige Zeile asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag asgdkagdkhsag"]
Dim $hDatei, $hNocheineDatei
Dim $Timer, $i, $sTemp
Dim $arrayDatei[1]
;Datei anlegen
[/autoit] [autoit][/autoit] [autoit]$hDatei = FileOpen("test.log",2)
MsgBox(1,"Datei anlegen","Lege test.log mit 500.000 Zeilen an")
$Timer = "Startzeit: " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF
For $i = 1 To 500000 Step 1
FileWriteLine($hDatei,$arrayTexte[Random(0,4,1)])
Next
FileClose($hDatei)
$Timer = $Timer & "Stopzeit: " & @HOUR & ":" & @MIN & ":" & @SEC
MsgBox(1,"Zeit für Datei anlegen:",$Timer)
;Datei in Array einlesen
$arrayDatei[0] = 0
$i = 0
$hDatei = FileOpen("test.log",0)
$hNocheineDatei = FileOpen("ausgabe.log",2)
MsgBox(1,"Datei einlesen","Lese test.log mit 500.000 Zeilen ein")
$Timer = "Startzeit: " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF
While 1 > 0
$sTemp = FileReadLine($hDatei)
If @error = -1 Then
$Timer = $Timer & "Stopzeit: " & @HOUR & ":" & @MIN & ":" & @SEC
MsgBox(1,"Zeit für Datei einlesen:",$Timer)
FileClose($hDatei)
FileClose($hNocheineDatei)
ExitLoop
Else
;_ArrayAdd($arrayDatei,$sTemp)
$i = $i + 1
;$arrayDatei[0] = $arrayDatei[0] + 1
If StringInStr($sTemp,"RunningTime") > 0 Then
;ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & "---" & $i & "RunningTime" & @CRLF)
StringReplace($sTemp,"RunningTime","Das ist viel viel besser")
FileWriteLine($hNocheineDatei,$sTemp)
Else
;ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & "---" & $i & @CRLF)
EndIf
EndIf
WEnd
Achja, Nachtrag:
Vergiss das mit den Arrays - ich habe einen Test mit _ArrayAdd gemacht (sieht im Quelltext) und nach ein paar Minuten abgebrochen .... dauert zu lange oder falsche Methode
Mhh,
eine Möglichkeit wäre das Logfile Zeile für Zeile abzuarbeiten - allerdings wird das Zeilenweise einlesen warscheinlich nicht so effektiv sein - andererseits könnte es die 10 Minuten doch locker schlagen
Also nicht alles einlesen und nacheinander nach den Schlüsselwörtern durchsuchen sondern
Zeile einlesen, auf Schlüsselwörter prüfen, nächste Zeile.
Eine Methode dazwischen: Du liesst das Logfile in ein Array ein - ich hatte gerade mal gesucht aber nicht die Limits für ein Array gefunden.
Ein Test mit einem Array mit 500.000 Zeilen ergab mit einer Prüfung und Textausgabe auf meinen Rechner einer Laufzeit von 50 Sekunden - ohne das Einlesen.
Ich muss jetzt noch weg - ich würde sonst nacher mal einen Testkandidaten schreiben (der mir die daten erzeugt und wieder einliest), aber das sieht für mich schneller aus wenn du die Art der Prüfung umkehrst.
BLinz
Moin,
Ich bastle mir gerade einen kleinen Uploader. Unter anderem verwende ich darin eine Progressbar mit einem Label darüber.
Während des Uploads wird die Progressbar und der Text regelmäßig aktualisiert.
Das klappt auch alles - nur leider verschwindet der Text regelmäßig hinter der Progressbar bzw. wenn ich fertig bin sogar ganz.
Hier ein Beispielprogramm an dem Ihr sehen könnt was ich meine:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form2 = GUICreate("Test Label über Progressbar", 405, 99, 598, 391)
$Progress1 = GUICtrlCreateProgress(8, 8, 385, 49)
$Label1 = GUICtrlCreateLabel("Label1", 8, 24, 385, 17, $SS_CENTER)
GUICtrlSetFont(-1, 12, 800, 0, "Courier New")
$Button1 = GUICtrlCreateButton("Start", 8, 64, 385, 33)
GUISetState(@SW_SHOW)
GUICtrlSetBkColor($Label1,$GUI_BKCOLOR_TRANSPARENT)
[/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
For $i = 0 To 100 Step 1
GUICtrlSetData($Progress1,$i)
GUICtrlSetData($Label1,$i & "%")
Sleep(100)
Next
EndSwitch
WEnd
Das Problem habe ich unter Windows 7 (64Bit), ob es unter anderen Windows Versionen auch so ist weis ich nicht
Also, was kann ich tun? oder muss ich damit leben?
BLinz
lass mal bei dem Dim des Arrays die [3] weg,
Eigentlich weis man bei "StringSplit($line, ":", 2)" nicht wie groß das Array wird:
aus der Hilfe:
Zitatflag = 2, deaktiviert die Rückgabe der Anzahl im ersten Element. Dadurch wird das Array 0-basierend. Man muss nun mit UBound() die Größe des Arrays feststellen.
mhh, ich bin nicht sicher ob ich deine Antwort so ganz verstanden habe....
Zum
Zitatkann amn dann leider nicht das gesamte Potential seines PC's ausschöpfen
Naja, so läuft Virtualisierung - bei uns laufen auf die Art und weise so 50 bis 80 VM's auf einer Hosthardware. Das ganze funktioniert nur so gut weil die meisten Systeme doch 99% der Zeit gar nichts machen.
Klar, die Festplatte eines Notebooks bremst beim Start der Systeme - dann aber dann ...
Aber - mach wie du willst
wow, 3 Antworten während ich an der Lösung getippt habe - hey ich wollte niemanden in den Rücken fallen ....