*.exe auf CD-ROM starten

  • Hallo, ich habe mal wieder ein kleines Problem und komme nicht weiter.

    Ich möchte mit einem AutoIt-Skript ein Programm auf einer CD bzw. DVD starten.

    Dabei soll AutoIt selbständig das CD-ROM suchen. Es soll auch bei zwei vorhandenen CD-ROM das richtige auswählen.


    Ein Bekannter hat mir das folgende Skript erstellt:


    $var = DriveGetDrive( "cdrom" )
    $cdrom = ""
    $checkpoint = "\Software\Foxit Reader.exe"

    If NOT @error Then
    For $i = 1 to $var[0]
    If(FileExists($var[$i] & $checkpoint)) Then
    $cdrom = $var[$i]
    ExitLoop
    EndIf
    Next

    Run( $cdrom & $checkpoint )

    Sleep(5000)

    Exit
    EndIf


    Grundsätzlich funktioniert das auch, aber nur, wenn am Rechner nur ein CD-ROM vorhanden ist.

    Sobald ein zweites CD_ROM vorhanden ist, wird zunächst das Master - CD-ROM angesprochen.

    Wenn die CD mit dem Prog in dem Laufwerk ist, dann läuft das Skript korrekt ab und das Prog wird gestartet.

    Liegt die CD aber in im Slave - CD-ROM, bekomme ich eine Fehlermeldung mit dem Hinweis, dass sich kein Datenträger im Laufwerk befindet und ich werde aufgefordert, einen Datenträger in der Master - CD-Rom zu legen.
    Zur Bestätigung kann ich zwischen "abbrechen", "wiederholen" und "weiter" wählen. Wenn ich "abbrechen" oder "weiter" wähle, wird die Meldung wiederholt. Mit einem weiteren Klick auf "abbrechen" oder "weiter" wird dann das zweite CD-ROM angesprochen und das Programm wird ausgeführt.


    Wie bekomme ich es hin, dass AutoIt selbständig und vor allem ohne Fehlermeldung bzw. Nachfrage das richtige CD-ROM ansteuert und das Prog startet?

    Ich möchte das Skript in eine unbeaufsichtigte Installation von Windows einbauen, das auf jedem Rechner anwendwar ist, egal wie viele CD-ROM vorhanden sind und egal welche Laufwerksbuchstaben den CD-ROMs zugewiesen sind.

    Gruß Tom

  • hallo,

    am besten werden alle cd-lfw. nach einer bestimmten datenträgerbezeichnung gesucht. bsp. cd99999 oder so. wenn die cd gefunden wurde , startet die anwendung dem path entsprechendem von der cd , oder es passiert einfach nix :D

    etwas so ?

    Spoiler anzeigen
    [autoit]


    $drives = DriveGetDrive('CDROM')
    For $i = 1 to $drives[0]
    If DriveStatus($drives[$i]) = 'READY' Then
    If DriveGetLabel($drives[$i]) = "Name der CD" Then
    RUN($drives[$i] &"\Software\Foxit Reader.exe")
    Else
    ContinueLoop
    EndIf
    EndIf
    Next

    [/autoit]

    MfG
    trallala

    4 Mal editiert, zuletzt von trallala (7. Februar 2007 um 23:33)

  • HI

    hab da ma ne frage: willst das programm später mit auf die cd brennen?
    wenn ja dann kannst du ja die autorun.inf einwenig modifizierren!

    also:
    Die autorun.inf müsste dann so ausehen:

    Code
    [Autorun.inf]
    icon=(beliebiges icon mit pfad aber ohne laufwerksbuchstaben)
    open=deinprogramm.exe

    und dann könntest du ja dann mit @scriptdir arbeiten und musst nicht die laufwerke durschsuchen!

    Ich hoffe dass dir das hilft^^


    mfg DjBasslord

  • Hi,

    Danke für die Tipps.

    Erst mal noch einige grundlegende Infos zu meiner Frage:

    Ich erstelle mir eine DVD für unbeaufsichtigte Windows-Installation inkl. meiner gesamten Software (mit WUCD-Creator von Vitali Graf - https://autoit.de/www.vitaligraf.de -), die ich standardisiert auf meinem PC installiere.

    Einige Skripte für die Installation bestimmter Progs "zicken" aber und lassen sich nicht installieren bzw. bleiben während der Installation ohne ersichtlichen Grund stehen. Irgendwann habe ich mitbekommen, dass diese Skripte nach Abschluß der Win-Installation fehlerfrei ablaufen. Also habe ich nach einem Weg gesucht, dies umzusetzen.

    Meine Lösung war dann, ein kleines Prog in den Autostart zu kopieren. Dieses löst dann das eigentliche Setup-Skript auf der CD aus und löscht sich anschließendselbst aus dem Autostart. So wird die Installation nach dem Reboot gestartet und läuft fehlerfrei. Dadurch wird mein Win-Setup noch etwas unbeaufsichtiger... Das Problem war, das ich einen festen Pfad vorgeben mußte, der dann auf einem anderen PC nicht passte. Daher suche ich nach einer Universal-Lösung.

    Foxit-Reader war nur ein Beispiel zum testen, da das Prog sofort läuft und ein Ergebnis ersichtlich ist.


    Den Tipp von Trallala habe ich auf mehreren PC bei denen die CD-Rom die unterschiedlichsten Buchstaben hatten, ausprobiert. Klappt problemslos, egal wie viele CD-ROM vorhanden waren. Hat lediglich den Nachteil, dass man den Titel der CD vorgeben muß. Aber das ist nicht wirklich ein Problem.
    Das ist für mich auf jeden Fall schon mal ein guter Lösungsansatz. Danke.

    Die anderen Tipps muß ich mir noch ansehen.


    Gruß Tom

    2 Mal editiert, zuletzt von Onkel-tom (9. Februar 2007 um 09:52)

  • Hi,

    @ Th.merger:

    Ich habe mal mit "DriveGetLabel", "DriveGetType", "DriveGetDrive" herum probiert, bekomme aber keine Verbindung mit "FileExists" hin.

    Komme leider nicht weter.

    Kannst Du mir da noch weiter helfen?

    Gruß Tom

    • Offizieller Beitrag

    Hi
    ich hatte mal eine Funktion zur Erkennung optischer Laufwerke geschrieben (hier).
    Vielleicht kannst du das verwenden.

    Hier eine Idee von mir:

    Spoiler anzeigen
    [autoit]

    Dim $PathOnCD = "\" ; hier anpassen - muß mit Backslash beginnen
    Dim $Lw, $TruePath

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 2
    $Lw = _GetCdDriveInfo($i,1)
    If $Lw = "" Then
    MsgBox(16, '', "Kein CD-Laufwerk vorhanden.")
    ExitLoop
    Else
    If FileExists($Lw & $PathOnCD) Then
    $TruePath = $Lw & $PathOnCD
    ExitLoop
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function: _GetCdDriveInfo($cd_pos, $cd_info_type)
    ;
    ; Description: Get Info of physical CD/DVD-drives (Drive-Letter, Device-Name, Firmware)
    ;
    ; Parameter(s): $cd_pos
    ; 1= First Drive;
    ; 2= Second Drive;
    ; 3= Info of Both Drives with Seperator " | "
    ; $cd_info_type
    ; 1= Drive-Letter only
    ; 2= Device-Name only
    ; 3= Firmware-Version only
    ; 4= Drive-Letter & " " & Device-Name
    ; 5= Drive-Letter & " " & Device-Name & " " & Firmware-Version
    ;
    ; Return Value: i.e. D:[ HL-DT-ST DVDRAM GSA-4081B][ v.A100] | [E:][ TOSHIBA DVD-ROM SD-M1612][ v.1004]
    ; Sets @ERROR to: 1 - no CD/DVD-Device found
    ; 2 - Second CD/DVD-Device not found
    ; no @ERROR sets if $cd_pos= 3 and Second CD/DVD-Device was'nt found
    ; Return only First Drive Info
    ;
    ; Author: BugFix ([email='bug_fix@web.de'][/email])
    ;==================================================================================================
    #include <String.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetCdDriveInfo($cd_pos = 1, $cd_info_type = 1)
    $cd1 = ""
    $cd1_name = "no_drive"
    $cd1_fw = ""
    $cd2 = ""
    $cd2_name = "no_drive"
    $cd2_fw = ""
    $p2 = 0

    For $a = 68 To 90
    $drv = Chr($a)
    $reg = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices", "\DosDevices\" & $drv & ":")
    $val = ""
    $name = ""
    For $i = 1 To StringLen($reg) - 2 Step 2
    $tmp = _HexToString(StringMid($reg, $i, 2))
    If $tmp <> "" Then
    $val = $val & $tmp
    EndIf
    Next
    $p1 = StringInStr($val, "#") + 1
    $type = StringMid($val, $p1, 5)
    If $type = "CdRom" Then
    $p2 = StringInStr($val, "__")
    If $p2 > 6 Then
    $name = StringMid($val, $p1 + 5, $p2- ($p1 + 5))
    $name = StringReplace($name, "_", " ")
    If $cd1 = "" Then
    $cd1 = $drv & ":"
    $cd1_name = $name
    Else
    $cd2 = $drv & ":"
    $cd2_name = $name
    EndIf
    $p3 = StringInStr($val, "#", 0, 2)
    For $i = $p3 - 1 To $p2 Step - 1
    If StringMid($val, $i, 1) <> "_" Then
    $pos_fw_end = $i
    ExitLoop
    EndIf
    Next
    For $i = $pos_fw_end To $p2 Step - 1
    If StringMid($val, $i, 1) = "_" Then
    $pos_fw_begin = $i+1
    $fw_len = $pos_fw_end - $pos_fw_begin +1
    ExitLoop
    EndIf
    Next
    $cd_fw = "v." & StringMid($val, $pos_fw_begin, $fw_len)
    If $cd1_fw = "" Then
    $cd1_fw = $cd_fw
    Else
    $cd2_fw = $cd_fw
    EndIf
    EndIf
    EndIf
    $p2 = 0
    Next
    If $cd1_name = "no_drive" And $cd2_name = "no_drive" Then
    SetError(1)
    Return False
    EndIf
    If $cd2_name = "no_drive" And $cd_pos = 2 Then
    SetError(2)
    Return False
    EndIf
    Select
    Case ($cd_pos = 1 Or ($cd_pos = 3 And $cd2_name = "no_drive")) And $cd_info_type = 1
    Return $cd1
    Case ($cd_pos = 1 Or ($cd_pos = 3 And $cd2_name = "no_drive")) And $cd_info_type = 2
    Return $cd1_name
    Case ($cd_pos = 1 Or ($cd_pos = 3 And $cd2_name = "no_drive")) And $cd_info_type = 3
    Return $cd1_fw
    Case ($cd_pos = 1 Or ($cd_pos = 3 And $cd2_name = "no_drive")) And $cd_info_type = 4
    Return $cd1 & " " & $cd1_name
    Case ($cd_pos = 1 Or ($cd_pos = 3 And $cd2_name = "no_drive")) And $cd_info_type = 5
    Return $cd1 & " " & $cd1_name & " " & $cd1_fw
    Case $cd_pos = 2 And $cd_info_type = 1
    Return $cd2
    Case $cd_pos = 2 And $cd_info_type = 2
    Return $cd2_name
    Case $cd_pos = 2 And $cd_info_type = 3
    Return $cd2_fw
    Case $cd_pos = 2 And $cd_info_type = 4
    Return $cd2 & " " & $cd2_name
    Case $cd_pos = 2 And $cd_info_type = 5
    Return $cd2 & " " & $cd2_name & " " & $cd2_fw
    Case $cd_pos = 3 And $cd_info_type = 1
    Return $cd1 & " | " & $cd2
    Case $cd_pos = 3 And $cd_info_type = 2
    Return $cd1_name & " | " & $cd2_name
    Case $cd_pos = 3 And $cd_info_type = 3
    Return $cd1_fw & " | " & $cd2_fw
    Case $cd_pos = 3 And $cd_info_type = 4
    Return $cd1 & " " & $cd1_name & " | " & $cd2 & " " & $cd2_name
    Case $cd_pos = 3 And $cd_info_type = 5
    Return $cd1 & " " & $cd1_name & " " & $cd1_fw & " | " & $cd2 & " " & $cd2_name & " " & $cd2_fw
    EndSelect
    EndFunc ;==>_GetCdDriveInfo

    [/autoit]
    • Offizieller Beitrag

    Hi,

    hier ein schneller Versuch:

    [autoit]


    ; Datei von CD-ROM starten
    MsgBox(64, '', _startFileFromCD('UserImages.bmp'))

    [/autoit][autoit][/autoit][autoit]

    Func _startFileFromCD($filename, $parameter = '', $workingDir = '', $verb = 'open', $flag = @SW_SHOW, $DriveType = "CDROM")
    Local $var = DriveGetDrive($DriveType)
    If Not @error Then
    For $i = 1 To $var[0]
    If FileExists($var[$i] & '\' & $filename) Then
    ShellExecute($var[$i] & '\' & $filename, $parameter, $workingDir, $verb, $flag)
    Return 1
    EndIf
    Next
    Return 0
    EndIf
    Return -1
    EndFunc ;==>_startFileFromCD

    [/autoit]

    So long,

    Mega

  • Hi,

    noch mal Danke für die Anregungen.

    Den Hinweis von Bugfix konnte ich nicht nachvollziehen. Dafür reichen meine Kenntnisse einfach nicht aus.

    Der Tipp von th.merger funktioniert grundsätzlich. Leider tritt der gleiche Effekt ein, wie in meinem ersten Post beschrieben. (Fehlermeldung -> kein Datenträger in Laufwerk... (ist das Master-Laufwerk). Nach 2 x Bestätigung wird das Prog dann ausgeführt.
    Außerdem bleibt am Ende die Msg-Box, die mit Klick auf O.K. geschlossen werden muß.

    Komme leider nicht weiter.

    Gruß Tom

  • Hi Leute,

    hab mich jetzt für die Alternative von trallala entschieden.

    Die Methode hat den Vorteil, dass ich sie auch ohne großen Aufwand für andere Aktionen (z.B. FileCopy oder DirCopy) nutzen kann, ohne dass es meine AutoIt-Fähigkeiten überfordert.

    Es ist auch nicht wirklich ein Problem, dass der CD-Name definiert werden muß.

    Noch mal Danke an alle, die mich unterstützt haben.

    Ich schließe das Thema hiermit als gelöst ab.

    Gruß Tom