!
[autoit]GUICtrlSetData($id, GUICtrlRead($id) & @CRLF & $neuerText)
[/autoit]!
[autoit]GUICtrlSetData($id, GUICtrlRead($id) & @CRLF & $neuerText)
[/autoit]So:
[autoit]GUICtrlSetData($id, GUICtrlRead($id) & $neuerText)
[/autoit]Ich weiß es nicht. habe mich da auf dieses Zitat bezogen
Zitat
kann ich den 2ten jedoch nicht in diesem moment auch noch nutzten, also wären die MsgBox darsteht...
Gut diese Äußerung war mir, beim Schreiben meiner Antwort, durchgerutscht. Da hast Du natürlich recht...
Ich hätte noch:
[autoit]$string = "C:\Windows\System32\winrm\0407\"
If StringRight($string, 1) <> "\" Then $string &= "\" ; Sicherheit das der Pfad mit '\' endet
MsgBox(0, "", StringLeft($string, StringInStr($string,"\",0,-2))) ; zweites Vorkommen von rechts
Das liegt daran, dass MsgBoxen das Skript pausieren. Ich hatte mal eine _MsgBox() UDF erstellt, mit der es möglich ist, das zu umgehen. Leider wurde sie nie ganz fertig ( ich bin an der Flag-Abfrage gescheitert)
Ich glaube die MsgBox'n beendet er schon, in der 10s Pause. Oder ?
Das ist alles eine Frage des Ablaufs. Gibt einige Lösungen die zu einem Ziel führen, z.B. so....
Global $gestartet = False
Global $start
While 1
$msg = GUIGetMsg()
Select
case $msg = $btnStart
MsgBox (64, "Test", "Test 01")
$gestartet = True
$start = TimerInit()
case $msg = $btnStop
Exit
; Nur beispiel
EndSelect
If $gestartet = True And TimerDiff($start) > 10000 Then MsgBox (64, "Test", "Test 02")
WEnd
Der Trick an der Sache ist halt, das Du das Script weiter durch die WHILE-WEND-Schleifen laufen lassen musst, in der die GUIGetMsg()-Abfrage steht. Damit der Klick auf Exit erkannt wird.
Bei Sleep() steht das Script anfach an der Stelle und macht erst weiter, wenn die Zeit um ist. Außer vielleich durch AdLibEnable()/AdLibRegister() unterbrochen.
Alle Möglichekeiten die man die genannt hat, schließt Du ja aus !
Es gibt meines Wissens nach nur diese Probleme, die das Löschen eines Ordners unter Windows verhindern:
1. Eine darin befindliche Datei oder ein darin befindlicher Ordner ist in Benutzung eines laufenden Prozesses. Kann z.B. aber auch sein, das eine DLL aus dem Ordner nachgeladen wird, die beim ProcessClose() nicht mit entladen wird und daher weiterhin aktiviert bleibt. Gutes Tool hierfür ist: ProcessExplorer.
2. Der Ordner ist durch ein anderes Programm oder ein Explorer-Fenster derzeit geöffnet.
3. Der Ordner ist in der Registry als zu schützender Ordner markiert. Ich weiß derzeit aber nicht mehr, wo das eingetragen wurde. z.B. Ordner für die Windows-Systemdateien sind so geschützt.
Ansonsten fällt mir auch nichts mehr ein.
Edit: Einen habe ich noch. Jemand hat aus dem Ordner ein AutoIt-Script gestartet, in welchem ein Run() ausgeführt wird. Wenn man bei diesem Run() nicht z.B. @TempDir als Arbeitsverzeichnis mitgibt, wird das @ScriptDir als Arbeitsverzeichnis. Dies ist dann der aktuelle Ordner und der lässt sich dann erst nach Ende der Run() wieder löschen.
Mist, "Copy And Paste"-Fehler !
Ich hab auch noch eine Variante die ohne Array auskommt:
MsgBox(0, "Standardbrowser", "des Systems : "& @TAB & _Get_Standardbrowser(False) & @CRLF & @CRLF & "des Users : " & @TAB & _Get_Standardbrowser(True))
[/autoit] [autoit][/autoit] [autoit]Func _Get_Standardbrowser($user = True)
If $user Then
$key = RegRead("HKEY_CURRENT_USER\Software\Classes\http\shell\open\command","")
Else
$key = RegRead("HKEY_CLASSES_ROOT\http\shell\open\command","")
EndIf
If StringLeft($key, 1) = '"' Then
$key = StringMid($key, 2, StringInStr($key, '"', 0, 2) - 2)
Else
If StringInStr($key, " ") > 0 Then $key = StringLeft($key, StringInStr($key, " ") - 1)
EndIf
If StringLen($key) > 0 Then Return $key
Return 0
EndFunc
Edit: Nach Einwand von Oscar jetzt auch "des Users".
Edit2: Fehler korrigiert. Danke SEuBo.
Im Prinzip macht doch die Standard Management-Console für RemoteDesktop dies schon.
Du kannst doch die letzten Server/Rechner mit denen Du verbunden warst, alle per DropDown wieder wählen.
Oder Du muss obige Funktionsbeschreibung nochmal genauer beschreiben !
von IF $stick[0] <> 0 Then nach IF $stick <> 0 Then
Besser :
[autoit]If IsArray($stick) Then
[/autoit]Einfachste Art:
Am Anfang des Scripts "While True" und am Ende "Wend".
Schon läuft es endlos. Ist aber dann auch nur noch mit Taskmanager zu beenden. Und Du solltest noch ein geringes "Sleep()" in die "While-Wend-Schleife" nehmen, da sonst die Schleife, sollte kein USB-Stick zum Kopieren erkannt werden, zu schnell/oft läuft und den Rechner stark auslastet.
$stickname = "Name des USB-Sticks" ; zum erkennen welcher Stick
$stick = DriveGetDrive("REMOVABLE")
If Not FileExists(@ScriptDir & "\UsbBackup") Then DirCreate(@ScriptDir & "\UsbBackup")
[/autoit][autoit][/autoit][autoit]If $stick[0] <> 0 Then
For $i = 1 To $stick[0]
If DriveGetLabel($stick[$i]) = $stickname Then ; meinen USB-Stick erkannt
$search = FileFindFirstFile($stick[$i] & "*")
While True
$object = FileFindNextFile($search)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($stick[$i] & "\" & $object),"D") > 0 Then ; Ordner erkannt
DirCopy($stick[$i] & "\" & $object, @ScriptDir & "\UsbBackup\" & $object) ; hier ggf. ",1" wenn überschrieben werden soll
Else
FileCopy($stick[$i] & "\" & $object, @ScriptDir & "\UsbBackup\" & $object) ; hier ggf. auch ",1"
EndIf
Wend
FileClose($search)
EndIf
Next
EndIf
So könnte es klappen !
$stick = DriveGetDrive("REMOVABLE")
DirCreate("UsbBackup") ; erzeugt einen Ordner, aber wo ? Im aktuellen Arbeitsverzeichnis ?
[/autoit][autoit][/autoit][autoit]If $stick[0] <> 0 Then
For $i = 1 To $stick[0] ; durchläuft alle Wechseldatenträger, nicht nur den der angesteckt ist
$datei = FileFindFirstFile($stick[$i] & "*"); öffnet auf jedem Datenträger ein Handle in der gleichen Variable, wobei nur das letzte überbleibt
Next
EndIf
While 1
$file = FileFindNextFile($datei); durchläuft das LETZTE Such-Handle
If @error Then ExitLoop ; und bricht am letzten Objekt des Ordners ab
DirMove($file, "UsbBackup"); verschiebt nur Ordner incl. Sub/Files - aber keine Datei-Objekte direkt
MsgBox(0, "", $file, 1)
WEnd
Ich glaube das sind so viele Probleme drin, das man das ganze neu aufbauen sollte. Ich habe mal einiges im Quellcode kommentiert...
Warum? Paßt doch: 0 Mails, 0 Oktets.
Na gut, so gesehen hast Du recht !
Aber das CRLF (siehe Edit meines letzten Post) ist trotzdem nicht Ok.
_POP3Stat() liefert meiner Meinung nach bei einem leeren Postfach noch etwas falsches ab.
Die Funktion liefert ein Array mit zwei Elementen, wobei beide "0" sind.
Der Befehl "__POP3Cmd("STAT")" der Funktion liefert bei mir "0 0" und CRLF zurück, woraus das StringSplit die zwei Elemente erzeugt.
Sollte man das nicht bessser abfangen ?
>>> Edit: <<<
Und noch eine Kleinigkeit an der gleichen Stelle: Egal ob Mails im Portfach vorhanden oder nicht: Am letzten Element des Array's hängt noch das CRLF !
Bei mir klappt es jetzt natürlich auch....
Ich habe einen Fehler darin gefunden:
Wenn das Postfach leer ist, bricht '_POPInfo()' in Zeile 84
[autoit]Local $aRet[$aTMP[0]][$iInf]
[/autoit]
ab, weil '$aTMP[0]' = '0' ist.
Jedenfalls bei Web.de.
Unter Umständen so:
Func _TCPRecvFile($sFile,$sIP,$iPort,$iTimeout=0,$bPopup=1,$bShowMessageOnSuccess=1,$iSleep=10,$iPartsize=128)
Local $ListeningSocket, $hTimer, $iConnectedSocket, $iCurrenttime, $Recv, $iFilesize, $SFilename
Local $sBuffer, $iFilesizeMB, $iNewTime, $iOldTime, $iRate, $iSent, $iTime, $hFile
Local $IsError = False ; Variable definieren
If $bPopup Then ProgressOn("Empfang des Scan's","Warte auf Sendung des Scans","Warten",-1,-1,16)
$ListeningSocket = TCPListen($sIP,$iPort)
If $bPopup And Not $iTimeout Then ProgressSet(0,"Warte auf Verbindung")
If $bPopup And $iTimeout Then ProgressSet(0,"Warte noch "&$iTimeout&" Sekunden")
If $iTimeout Then $hTimer = TimerInit()
Do
$iConnectedSocket = TCPAccept($ListeningSocket)
Sleep(100)
If $bPopup And $iTimeout Then
$iCurrenttime = Int(TimerDiff($hTimer)/1000)
ProgressSet((TimerDiff($hTimer)/1000)/$iTimeout*100,"Warte noch "&$iTimeout-$iCurrenttime&" Sekunden")
If $iCurrenttime >= $iTimeout Then
ProgressSet(100,"Timeout abgelaufen. Es wurde kein Scan gesendet !")
Sleep(5000)
SetError(1)
ProgressOff()
Return 0
EndIf
EndIf
Until $iConnectedSocket > -1
Do
$Recv = TCPRecv($iConnectedSocket,2048)
Sleep(100)
Until $Recv <> ""
$Recv = StringSplit($Recv,Chr(3))
$iFilesize = $Recv[2]
$SFilename = $Recv[1]
$sBuffer = Binary("")
If $bPopup Then
$hTimer = TimerInit()
$iFilesizeMB = Round($iFilesize/1024^2,2)
ProgressSet(0,"Sende 0.0 von "&$iFilesizeMB&" MB @ 0.0 kb/s","Datei senden...")
EndIf
Do
$Recv = TCPRecv($iConnectedSocket,$iPartsize*1024)
If @error Then ; hier den Fehler abfragen und reagieren
$IsError = True
ExitLoop
EndIf
$sBuffer &= Binary($Recv)
Sleep($iSleep)
If $bPopup Then
$iNewTime = TimerDiff($hTimer)
$iTime = $iNewTime - $iOldTime
$iRate = (BinaryLen($Recv)/$iTime)/1.024
$iSent = (BinaryLen($sBuffer))/1024^2
ProgressSet($iSent/$iFilesizeMB*100,"Empfange "&Round($iSent,2)&" von "&$iFilesizeMB&" @ "&Round($iRate,2)&" kb/s")
$iOldTime = $iNewTime
EndIf
Until BinaryLen($sBuffer) >= $iFilesize
If $IsError = False Then ; wenn keine Fehler dann...
If $sFile = "" Then $sFile = $SFilename
$hFile = FileOpen($sFile,18)
FileWrite($hFile,$sBuffer)
FileClose($hFile)
$sBuffer = ""
TCPCloseSocket($ListeningSocket)
TCPCloseSocket($iConnectedSocket)
If $bShowMessageOnSuccess Then MsgBox(64+262144,"Empfang des Scan's","Scan erfolgreich empfangen")
ProgressOff()
Return 1
Else ; ansonsten zeige immer eine Fehler-Messagebox
MsgBox(48+262144,"Fehler","Scan konnte nicht komplett empfangen werden !")
$sBuffer = ""
TCPCloseSocket($ListeningSocket)
TCPCloseSocket($iConnectedSocket)
ProgressOff()
Return 0
EndIf
EndFunc
Ich habe das aber nicht getestet, da ich gerade anderweitig beschäftigt bin. Einige Zeilen sind etwas verändert. Wichtige Punkte sind mit Kommentaren versehen.
Edit: Habe gerade noch einen Fehler korrigiert.
Hallo,
Jajaja - Ich weiß, sie ist veraltet. Ich setze mich die Tage mal dran wenn ich wieder Zeit finde und überarbeite sie
Gruß
Spider
Die Funktion die ich verwendet habe und die zu damaliger Zeit einwandfrei lief, ist aber von "DJ Baselord".
Was aber nicht heißen soll das ein Teil seiner Funktion, Ähnlichkeiten mit Deiner haben könnte.