Achtung: Exportierte Reg-Dateien ab Windows 2000, sind standardmäßig UNICODE !
Das heißt aus dem CRLF ( Hex '0d 0a' ) wird dann Hex '0d 00 0a 00'. Andere Zeichen
natürlich auch....
Achtung: Exportierte Reg-Dateien ab Windows 2000, sind standardmäßig UNICODE !
Das heißt aus dem CRLF ( Hex '0d 0a' ) wird dann Hex '0d 00 0a 00'. Andere Zeichen
natürlich auch....
Das Tool von Uwe Sieber hatte ich auch vorher im Einsatz. Es gibt aber diverse Unterschiede beim Abmelden des USB-Sticks. Das eine Tool läuft nur einwandfrei unter Win2000, das andere kann den USB-Stick nicht auswerfen wenn zum Beispiel der Total-Commander den Ordner offen hat.
Zum Schluß blieb ich bei dem 'USB-Deview'. Es lief im Großen und Ganzen am besten.
@Ritzelrocker04: Aber dann verstellt mir doch das Script die Rechnerlautstärke jedesmal, oder ?
Ich habe so etwas auch mal benötigt und in AutoIt, unter zu Hilfenahme des USBDeview-Tool, geschrieben.
Nachtrag:
Hier nochmal eine Version (im Gegensatz zur Variante im ZIP-File), die durch 'FileInstall' mit nur einer EXE-Datei nach kompilieren auskommt.
opt("TrayIconHide",1)
#include <GUIConstants.au3>
FileInstall("Fehler.wav",@tempdir & "\Fehler.wav",1)
FileInstall("Entfernen.wav",@tempdir & "\Entfernen.wav",1)
FileInstall("USBDeview.exe",@tempdir & "\USBDeview.exe",1)
if $cmdline[0] <> 0 then
if stringlen($cmdline[1]) = 1 then
$drive = stringupper($cmdline[1]) & ":"
else
$drive = stringupper($cmdline[1])
endif
else
GUICreate("Fehlermeldung !",300,100,-1,-1,$WS_CAPTION & $WS_POPUP,$WS_EX_TOOLWINDOW)
GUICtrlCreateLabel("Der Programmaufruf lautet wie folgt :" & @CRLF & @CRLF & "USBUnmount.exe <LAUFWERK>",50,10,-1,-1)
$ok_button = GUICtrlCreateButton ( "Ok",120,60,60,30,$BS_DEFPUSHBUTTON)
GUISetState (@SW_SHOW)
if fileexists(@tempdir & "\Fehler.wav") then
SoundPlay(@tempdir & "\Fehler.wav",1)
endif
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
;nix
Case $msg = $ok_button
Exit(1)
EndSelect
Wend
endif
$count = 0
if fileexists($drive) then
$prozesse = processlist("PStart.exe")
if $prozesse[0][0] <> 0 then
if fileexists($drive & "\PStart.exe") then
runwait($drive & "\PStart.exe /exit",$drive,@SW_HIDE)
else
processclose("PStart.exe")
endif
endif
runwait(@tempdir & "\USBDeview.exe /stop_by_drive " & $drive,@scriptdir,@SW_HIDE)
while fileexists($drive)
runwait(@tempdir & "\USBDeview.exe /stop_by_drive " & $drive,@scriptdir,@SW_HIDE)
sleep(500)
$count = $count + 1
if $count = 5 then
GUICreate("Fehlermeldung !",300,100,-1,-1,$WS_CAPTION & $WS_POPUP,$WS_EX_TOOLWINDOW)
GUICtrlCreateLabel("Das Laufwerk ' " & $drive & " ' konnte nicht beendet werden !",30,20,-1,-1)
$ok_button = GUICtrlCreateButton ( "Ok",120,60,60,30,$BS_DEFPUSHBUTTON)
GUISetState (@SW_SHOW)
if fileexists(@tempdir & "\Fehler.wav") then
SoundPlay(@tempdir & "\Fehler.wav",1)
endif
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
;nix
Case $msg = $ok_button
Exit(1)
EndSelect
Wend
endif
wend
if fileexists(@tempdir & "\Entfernen.wav") then
SoundPlay(@tempdir & "\Entfernen.wav",1)
endif
else
GUICreate("Fehlermeldung !",300,100,-1,-1,$WS_CAPTION & $WS_POPUP,$WS_EX_TOOLWINDOW)
GUICtrlCreateLabel("Das Laufwerk ' " & $drive & " ' ist nicht vorhanden !",55,20,-1,-1)
$ok_button = GUICtrlCreateButton ( "Ok",120,60,60,30,$BS_DEFPUSHBUTTON)
GUISetState (@SW_SHOW)
if fileexists(@tempdir & "\Fehler.wav") then
SoundPlay(@tempdir & "\Fehler.wav",1)
endif
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
;nix
Case $msg = $ok_button
Exit(1)
EndSelect
Wend
endif
if FileExists(@Tempdir & "\Fehler.wav") then FileDelete(@Tempdir & "\Fehler.wav")
if FileExists(@Tempdir & "\Entfernen.wav") then FileDelete(@Tempdir & "\Entfernen.wav")
if FileExists(@Tempdir & "\USBDeview.exe") then FileDelete(@Tempdir & "\USBDeview.exe")
Hinter das "wend" ab Zeile 34 ???
Da kommt doch Dein Script nie hin !
Es läuft doch von "while 1" bis "wend" oder verlässt das Programm mit "exit".
Außerdem öffnet und schließt FileWrite eine Datei doch sowieso. Die Variante mit Open & Close ist zwar ordentlicher aber Alina's Code funktioniert bei mir,.... fast:
- _FileCreate habe ich nicht (wird bei mir aber auch nicht gebraucht
- die Anführungszeichen um das "ffmpeg" sollten doch bestimmt um die Eingangsdatei, oder ?
- einige Leerzeichen im FFMpeg-Aufruf sind doppelt, sollte aber trotzdem gehen
- die Endung für das Out-File muss eigentlich .mpg lauten oder ?
Aber ich habe Alina's Varainte etwas zum Test vervollständigt (GUI) und leicht korrigiert...
[autoit]#include <GUIConstants.au3>
[/autoit][autoit][/autoit][autoit]$Form = GUICreate("Form",400,200)
$DwnInput = GUICtrlCreateInput("abcd",20,10)
GUISetState(@SW_SHOW)
If FileExists("test.bat") Then
FileDelete("test.bat")
EndIf
FileWrite("test.bat", "ffmpeg -i ")
FileWrite("test.bat", chr(34) & GUICtrlRead($DwnInput) & ".flv" & chr(34))
FileWrite("test.bat", " -vcodec mpeg1video -acodec copy -b 600 ")
FileWrite("test.bat", chr(34) & GUICtrlRead($DwnInput) & ".mpg" & chr(34))
Ich hatte mit bei meinem Test, keine Probleme. Der FileCopy-Ersatz mit ProgressBar-Aktualisierung funktioniert mit einer über 700MB großen Testdatei.
Ich kann mir das nicht erklären, warum nur 1/4 kopiert werden sollte.
AspirinJunkie:
Die Idee mit der Blocksize=FileSize/99 ist natürlich gut !
Ich würde das wie folgt zusammensetzen (Vorrasusetzung die Namen sind mit StringSplit getrennt und z.B. im Array '$daten'):
[autoit]
$kurzname = StringUpper(StringLeft($daten[1],1)) & StringLower(StringMid($daten[1],2,1)) & _
StringUpper(StringLeft($daten[2],1)) & StringLower(StringMid($daten[2],2,1))
Ist frei geschrieben und ungetestet !
Wie folgt KÖNNTE es funktionieren:
[autoit]RunWait(@ComSpec & ' /c ' & "RDsys/7za.exe a -tzip " & chr(34) & _
@MyDocumentsdir & "\Test-0" & @WDAY & ".zip" & chr(34) & _
" C:\$$", @ScriptDir, @SW_MINIMIZE)
KÖNNTE aus folgenden Gründen:
- ich habe kein 7za.exe auf meinem PC
- das alte PKZIP was ich zum Testen benutzt habe, weigert sich Ordner mit mehr wie 8 Zeichen zu benutzen
Wenn man die Variablen wie @MyDocumentsDir, @TempDir, @UserProfileDir, u.s.w. am besten den kompletten String immer in Anführungszeichen ( chr(34) ) packen. Wer weiß wo der Ordner beim ausführenden User liegt.
Als Ersatz für FileCopy könnte folgende Variante dienen:
[autoit]#include <GUIConstants.au3>
[/autoit][autoit][/autoit][autoit]Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 196, 47, 193, 125)
$Progress1 = GUICtrlCreateProgress(16, 8, 150, 17)
GUICtrlSetLimit(-1, 100, 0)
GUISetState(@SW_SHOW)
$filesize = 728369152 ; hier die Größe in Byte eintragen
$buffer = 1024
AdlibEnable("check",100)
$in = FileOpen("demo.exe",0)
$out = FileOpen("demo2.exe",1)
While 1
$daten = FileRead($in,$buffer)
If @error = -1 Then ExitLoop
FileWrite($out,$daten)
Wend
FileClose($in)
FileClose($out)
Sleep(5000)
Func check()
GUICtrlSetData($Progress1,Round(100 * FileGetSize("demo2.exe") / $filesize))
EndFunc
Aber das hilft nicht, wenn man mit FileInstall arbeiten will....
Kann es sein, das Dein '@MyDocumentsDir' Leerzeichen enthält ?
Doch, zum Schluß zeigte er mir 100% an. Aber von 0 auf 100 innerhalb einer Sekunde !
Ich musste aber beim FileInstall noch die Quelle ändern (Variablen sind dort nicht erlaubt, jedenfalls nicht bei meiner AutoIt-Version). Und bei meinem Beispiel fehlte noch eine ')' am Ende der GUICtrlSetData-Zeile.
Edit: Scheinbar wird AdLib nur in Pausenzeiten abgearbeitet und bei FileCopy und FileInstall gibt es keine !
Ich habe das jetzt mal getestet.
Scheinbar funktioniert während eines FileInstall bzw. FileCopy keine ADLib-Funktion !?!?
Ich habs zwar nicht getestet, aber so sollte es richtig angezeigt werden:
#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 196, 47, 193, 125)
$Progress1 = GUICtrlCreateProgress(16, 8, 150, 17)
GUICtrlSetLimit(-1, 100, 0)
GUISetState(@SW_SHOW)
$filesize = 12345678 ; hier die Größe in Byte eintragen
AdlibEnable("check",100)
FileInstall(@DesktopDir & "\downloads\installer\demo.exe",@DesktopDir & "\downloads\demo.exe")
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100)
WEnd
Func check()
GUICtrlSetData($Progress1,100 * Round(FileGetSize(@DesktopDir & "\downloads\demo.exe") / $filesize)
EndFunc
Also bei mir funktioniert Deine erste Lösung.
Mein '@MyDocumentsDir' liegt zwar nicht auch C:\ enthält aber in 'Eigene Dateien' auch ein Leerzeichen. Und auch der Quellpfad (@ScriptFullPath) enthielt in meinem Test ein Leerzeichen.
Es funktioniert auch, obwohl der abschließende '\' am Zielpfad fehlte, was ich erst als Fehler ausgemacht hatte.
muss das AdLibEnable nicht vor das FileInstall ?
Dann mach es halt so:
$gesamt = 15
$schleife1 = Random(3,12,1)
$schleife2 = $gesamt - $schleife1
...
Dann hast Du per Zufall zwischen 3 und 12 Durchläufe je Schleife und immer die gleiche Gesamtanzahl von Durchläufen.
Obwohl doch in eurer Variante die MsgBox IMMER erscheint !
Besser wäre ...
Global $Message
$Message = ""
Select
Case StringIsDigit($XC) = 0
$Message &= $XC & @CRLF
ContinueCase
Case StringIsDigit($MC) = 0
$Message &= $MC & @CRLF
ContinueCase
Case StringIsDigit($HC) = 0
$Message &= $HC & @CRLF
ContinueCase
Case StringIsDigit($AC) = 0
$Message &= $AC & @CRLF
ContinueCase
Case StringIsDigit($MK) = 0
$Message &= $MK & @CRLF
ContinueCase
Case StringIsDigit($HK) = 0
$Message &= $HK & @CRLF
ContinueCase
Case StringIsDigit($AK) = 0
$Message &= $AK & @CRLF
EndSelect
If $Message <> "" Then MsgBox(16, "Fehler", $Message)
Meinst Du wirklich VERSCHLÜSSELT oder nur das man es nicht lesen kann ?
Weil so wie Du es beschreibst scheint es ja nur etwas in dieser Art zu sein:
$pw = InputBox ( "Titel der Iputbox", "Das Passwort bitte...","","*")
MsgBox (0,"Ausgabe des Passworts",$pw)
Wichtig ist dabei ja der 4.Parameter der Inputbox.
Ich hoffe nicht ![]()
Das ermöglicht unstrukturiertes Springen im Programmcode !
In Kurzform sollte es so aussehen:
GUICtrlSetDATA ( $progressbarID, Round ([Bytes geschafft]/[Bytes gesamt] * 100))
Wobei $progressbarID die ID Deiner mit "GUICtrlCreateProgress" erzeugten Progressbar ist.
Kompliziert ist meist, die Größe des gesamten Downloads bei Beginn zu wissen.