Da ich immer wieder Ärger hatte, das die USB-Autostart-Tools (bei mir lief schon ewig der USBAgent) beim Einschalten meines Druckers einen Fehler hervorriefen (da kein Zugriff auf die Speicherkartenslots möglich ist), habe ich mir einen Ersatz programmiert.
Herausgekommen ist "USB_Autorun".
Spoiler anzeigen
; USB_Autorun_DriveGetDrive V1.1
; von M.Schröder 28.09.2008
;
; Das Programm wird z.B. per Autostart gestartet und wertet auf
; Wechseldatenträgern eine ggf. vorhandene "Autorun.inf" aus und
; startet gewünschte Dateien oder Programme beim Hinzufügen und
; Entfernen des Datenträgers.
;
; Eine "Autorun.inf" kann wie folgt aussehen:
; [autorun]
; icon=icon.ico
; open=start.exe
; close=stop.exe
#NoTrayIcon
#compiler_icon=USB_Autorun.ico
#compiler_outfile=USB_Autorun.exe
#include <array.au3>
Opt("TrayMenuMode",1)
Opt("TrayOnEventMode",1)
Opt("MustDeclareVars",1)
Dim $neu, $alt, $start, $stop, $i, $search, $file
Dim $trayexit, $time, $pid, $StopTimeout = 10000
; ggf. alte STOP-Dateien löschen
$search = FileFindFirstFile(@TEMPDIR & "\USBARS_*.*")
If $search <> -1 Then
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
FileDelete(@TEMPDIR & "\" & $file)
Wend
EndIf
FileClose($search)
; Neues Traymenue zum Beenden anlegen
$trayexit = TrayCreateItem("USB Autorun beenden")
TrayItemSetOnEvent(-1,"ExitEvent")
TraySetIcon("USB_Autorun.ico")
TraySetToolTip ("USB Autorun")
TraySetState()
While 1
$neu = GetDrives()
For $i = 1 To $neu[0]
If _ArraySearch($alt,$neu[$i]) < 1 And DriveStatus($neu[$i]) = "READY" Then
; neuer Wechseldatenträger hinzugefügt
$start = ""
$stop = ""
if FileExists($neu[$i] & "\Autorun.inf") then
$start = IniRead($neu[$i] & "\Autorun.inf","autorun","open","")
$stop = IniRead($neu[$i] & "\Autorun.inf","autorun","close","")
EndIf
If $stop <> "" And FileExists($neu[$i] & "\" & $stop) Then
FileCopy($neu[$i] & "\" & $stop, @TempDir & "\USBARS_" & StringLeft($neu[$i],1) & StringRight($stop,4))
EndIf
If $start <> "" And FileExists($neu[$i] & "\" & $start) Then
Run($neu[$i] & "\" & $start,"",$neu[$i] & "\")
EndIf
EndIf
Next
If IsArray($alt) And $alt[0] > 0 Then
For $i = 1 To $alt[0]
If _ArraySearch($neu,$alt[$i]) < 1 Then
; ein Wechseldatenträger wurde entfernt
$search = FileFindFirstFile(@TEMPDIR & "\USBARS_" & StringLeft($alt[$i],1) & ".*")
If $search <> -1 Then
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
$time = TimerInit()
$pid = Run(@TEMPDIR & "\" & $file)
; wartet auf das Beenden des Programms bzw. bis zum Timeout
; und versucht dann die Datei aus dem %TEMP-Ordner zu löschen
While ProcessExists($pid) And TimerDiff($time) < $StopTimeout
Sleep(100)
Wend
FileDelete(@TEMPDIR & "\" & $file)
Wend
EndIf
FileClose($search)
EndIf
Next
EndIf
$alt = $neu
Sleep (1000)
Wend
Func GetDrives()
Local $array_Drives
$array_Drives = drivegetdrive("REMOVABLE")
If IsArray($array_Drives) Then
_ArrayDelete($array_Drives,_ArraySearch($array_Drives,"a:"))
_ArrayDelete($array_Drives,_ArraySearch($array_Drives,"b:"))
$array_Drives[0] = UBound($array_Drives) -1
Else
Local $array_Drives[1]
$array_Drives[0] = 0
EndIf
Return $array_Drives
EndFunc
Func ExitEvent()
Exit
EndFunc
Vorteile:
- keine Installation, kann von einem eingeschränkten Konto aus dem Autostartordner laufen
- kein Fehler mehr, wenn im Laufwerk der Datenträger nicht bereit ist
- kann, wie auch der USBAgent, beim Entfernen eines Laufwerks ein Programm ausführen
Vielleicht kann es ja jemand gebrauchen...