DVD-Brenner Laufwerksbuchstabe ändern

  • Hi,
    nach längerere erfolgloser Suche muß ich doch einen Thread aufmachen.
    2 Kollegen und ich haben das Problem, dass bei unserem PC manchmal der Laufwerksbuchstabe des ersten DVD-Brenners verändert wird.
    Dies nervt X(

    Wie kann ich mit AutoIt genau für diesen Brenner ohne Neustart (wir haben 2 identische verbaut) den Laufwerksbuchstaben ändern?

    Hoffe ihr könnt mir helfen
    Danke ;)

    • Offizieller Beitrag

    Hab da was im Englischen Forum gefunden : http://www.autoitscript.com/forum/index.php?showtopic=81304&hl=driveletter
    Vielleicht kannst du das für dich beutzen.

  • Danke euch beiden

    Raupi ,
    verstehe leider nicht wie ich die Funktion anwenden soll

    Greenhorn,
    schönes Tool, jedoch kann es sein, dass der Laufwerksbuchstabe immer ein anderer ist.
    Deshalb muß ich doch irgendwie prüfen, auf welchem LW-Buchstaben sich der DVD-Brenner momentan befindet, oder nicht?

  • Hab mal das Beispiel aus dem englischen Forum umgebaut. Du brauchst nur noch das $Data_soll mit den Daten deiner DVD-Brenner ersetzen. Diese Daten erhälst du am einfachsten mit er Funktion _FindGUID('H:').

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Local $Data_soll[2][2] = [['y:', '\\?\Volume{0b5a276f-5ff8-11dd-8265-806d6172696f}'],['z:', '\\?\Volume{0b5a2770-5ff8-11dd-8265-806d6172696f}']]

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

    $Optical = DriveGetDrive('CDROM')
    Local $Data_ist[$Optical[0]][2]

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

    For $i = 0 To $Optical[0] - 1
    $Data_ist[$i][0] = $Optical[$i + 1]
    $Data_ist[$i][1] = _FindGUID($Data_ist[$i][0])
    Next

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

    For $i = 0 To UBound($Data_soll, 1) - 1
    If _ArraySearch($Data_ist, $Data_soll[$i][0]) = -1 Then
    $line = _ArraySearch($Data_ist, $Data_soll[$i][1], 0, 0, 0, 0, 1, 1)
    If $line = -1 Then
    MsgBox(16, 'Fehler', 'Laufwerk nicht gefunden oder nicht eingehängt!')
    Exit
    EndIf
    $s_cmd = "mountvol " & $Data_ist[$line][0] & " /D"
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    $s_cmd = "mountvol " & $Data_soll[$i][0] & " " & $Data_soll[$i][1]
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    EndIf
    Next

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

    Func _FindGUID($Drive)
    Local Const $DevList = 'HKLM\SYSTEM\MountedDevices'
    Local $i = 0
    Do
    If RegRead($DevList, '\DosDevices\' & $Drive) = RegRead($DevList, RegEnumVal($DevList, $i)) Then
    Return StringReplace(RegEnumVal($DevList, $i), '\??\', '\\?\', 1)
    EndIf
    $i += 1
    Until 0
    EndFunc ;==>_FindGUID

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hi funkey,
    danke nun habe ich es besser verstanden, aber es will noch nicht so ganz.

    Es ist folgendes:
    Standard:
    X DVD-Brenner 1 ID: 123
    Z DVD-Brenner 2 ID: 456

    Wenn ich nun eine Festplatte dazuschalte sieht es so aus
    G DVD-Brenner 1 ID: 789 (kann auch ein anderer Buchstabe sein)
    Z DVD-Brenner 2 ID: 456

    Wenn ich nun das Skript ausführen sagt er mir, dass er das Laufwerk nicht finden kann.
    Wenn ich das Laufwerk manuell auf G: zuweise ist die IDE des DVD-Brenner 123 und das Script klappt.

    Kannst du mir weiterhelfen, stehe irgendwie auf dem Schlauch :whistling:

  • Vllt kann man das Problem einfacher lösen?

    Spoiler anzeigen
    [autoit]

    $Drive_von = 'g:'
    $Drive_nach = 'x:'

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

    If DriveGetType($Drive_von) = 'CDROM' Then
    $GUID = _FindGUID($Drive_von)
    $s_cmd = "mountvol " & $Drive_von & " /D"
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    $s_cmd = "mountvol " & $Drive_nach & " " & $GUID
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    EndIf

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

    Func _FindGUID($Drive)
    Local Const $DevList = 'HKLM\SYSTEM\MountedDevices'
    Local $i = 0
    Do
    If RegRead($DevList, '\DosDevices\' & $Drive) = RegRead($DevList, RegEnumVal($DevList, $i)) Then
    Return StringReplace(RegEnumVal($DevList, $i), '\??\', '\\?\', 1)
    EndIf
    $i += 1
    Until 0
    EndFunc ;==>_FindGUID

    [/autoit]
  • Hi,
    nein geht leider auch nicht :(
    Es könnte statt G: auf T:, ... usw. sein.

    Man müsste abfragen auf welchem Buchstaben sich der DVD-Brenner befindet (mit der ID) , diesen Buchstaben freigibt und dann den neuen Buchstaben (x) mit dem DVD-Brenner setzen.
    Also ich dies probiert habe, hatte der DVD-Brenner gar keinen Buchstaben mehr :thumbdown:

  • Der Laufwerksbuchstabe für das Ziel darf noch nicht verwendet sein, sonst kann nicht mehr gemountet werden.
    Hab noch eine Abfrage hinzugefügt.

    Also, nächster Versuch:

    Spoiler anzeigen
    [autoit]

    For $i = 70 To 87 ; von F bis W
    If DriveGetType(Chr($i)&':') = 'CDROM' Then ExitLoop
    Next

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

    $Drive_von = Chr($i)&':'
    $Drive_nach = 'X:'

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

    If DriveGetType($Drive_nach) <> "" Then
    MsgBox(16,"Fehler", "Ziel-Laufwerksbuchstabe ist schon vorhanden!")
    Exit
    EndIf

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

    If DriveGetType($Drive_von) = 'CDROM' Then
    $GUID = _FindGUID($Drive_von)
    $s_cmd = "mountvol " & $Drive_von & " /D"
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    $s_cmd = "mountvol " & $Drive_nach & " " & $GUID
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    EndIf

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

    Func _FindGUID($Drive)
    Local Const $DevList = 'HKLM\SYSTEM\MountedDevices'
    Local $i = 0
    Do
    If RegRead($DevList, '\DosDevices\' & $Drive) = RegRead($DevList, RegEnumVal($DevList, $i)) Then
    Return StringReplace(RegEnumVal($DevList, $i), '\??\', '\\?\', 1)
    EndIf
    $i += 1
    Until 0
    EndFunc ;==>_FindGUID

    [/autoit]

    Edit: Sry, kleiner Fehler DriveGetDrive anstelle von DriveGetType

  • Hm,
    glaube es klappt einigermassen.
    Wobei es recht lange braucht bis der Buchstabe zugewiesen wird.

    Ist eigentlich die ID die mit _FindGUID ermittelt wird dem Brenner zugeordnet oder wird die variabel vergeben?
    Ich habe es auch schon gehabt, dass bei DVD-Brenner die Buchstaben wechselten.
    Dann sollte Brenner 1 auf X und Brenner 2 auf Z.
    Ist das auch möglich :rolleyes:

    EDIT:
    habs mal so probiert.
    Ich habe beide Buchstaben entfernt.
    Aber leider wird (meistens) nur ein Buchstabe geändert

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $tool_titel = "Laufwerk"

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

    $autostart_wert = "nein"
    ;Tool in den Autostart schreiben oder aus dem Autostart löschen
    $autostart_schluessel = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"
    If $autostart_wert = "ja" Then
    RegWrite($autostart_schluessel, $tool_titel, "REG_SZ", @ScriptFullPath)
    Else
    RegDelete($autostart_schluessel, $tool_titel)
    EndIf

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

    Local $Data_soll[2][2] = [['x:', '\\?\Volume{8f4890ee-c54f-11dd-b048-806d6172696f}'],['z:', '\\?\Volume{8f4890ef-c54f-11dd-b048-806d6172696f}']]

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

    $Optical = DriveGetDrive('CDROM')

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

    If $Optical <> "" Then
    Local $Data_ist[$Optical[0]][2]
    For $i = 0 To $Optical[0] - 1
    $Data_ist[$i][0] = $Optical[$i + 1]
    $Data_ist[$i][1] = _FindGUID($Data_ist[$i][0])
    Next
    ;~ _ArrayDisplay($Data_ist)
    ;~ _ArrayDisplay($Data_soll)
    ;~ _ArrayDisplay($Optical)
    Else
    Dim $Data_ist[1][1]
    EndIf

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

    If UBound($Data_soll) - 1 < UBound($Data_ist) - 1 Then
    $ende = UBound($Data_soll) - 1
    Else
    $ende = UBound($Data_ist) - 1
    EndIf

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

    For $i = 0 To $ende
    If $Data_soll[$i][0] <> $Data_ist[$i][0] Or $Data_soll[$i][1] <> $Data_ist[$i][1] Then
    $ungleich = 1
    ExitLoop
    Else
    $ungleich = 0
    EndIf
    Next

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

    If $ungleich = 1 Then
    For $i = 0 To UBound($Data_soll, 1) - 1
    ConsoleWrite($Data_soll[$i][0] & " " & $Data_soll[$i][1] & @CRLF)

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

    If $i <= UBound($Data_ist) - 1 Then
    $s_cmd = "mountvol " & $Data_ist[$i][0] & " /D"
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    EndIf

    $s_cmd = "mountvol " & $Data_soll[$i][0] & " " & $Data_soll[$i][1]
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    Next
    Else
    MsgBox(0, "", "Laufwerke OK")
    EndIf

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

    Func _FindGUID($Drive)
    Local Const $DevList = 'HKLM\SYSTEM\MountedDevices'
    Local $i = 0
    Do
    If RegRead($DevList, '\DosDevices\' & $Drive) = RegRead($DevList, RegEnumVal($DevList, $i)) Then
    Return StringReplace(RegEnumVal($DevList, $i), '\??\', '\\?\', 1)
    EndIf
    $i += 1
    Until 0
    EndFunc ;==>_FindGUID

    [/autoit]
  • Hab keine Ahnung ob die GUD variabel ist oder nicht, aber eher schon, denn sonst hättest du wahrscheinlich diese Probleme nicht.
    Ich habe es versucht irgendwie abzufangen, und außerdem hab ich das ganze in schöne Funktionen gepackt!

    :thumbup: POST 500 :thumbup:

    Spoiler anzeigen
    [autoit]

    $x = '\\?\Volume{0b5a276f-5ff8-11dd-8265-806d6172696f}'
    $z = '\\?\Volume{0b5a2770-5ff8-11dd-8265-806d6172696f}'
    $Drive_x = 'x:'
    $Drive_z = 'z:'
    Local $aGUID[1]

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

    For $i = 70 To 90 ; von F bis Z
    $j = 0
    If DriveGetType(Chr($i)&':') = 'CDROM' Then
    $aGUID[$j] = _Unmount_Drive(Chr($i) & ':') ;alle CDROM-Laufwerke von F bis Z unmounten
    $j +=1
    ReDim $aGUID[$j+1]
    EndIf
    Next

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

    If $aGUID[0] <> $x And $aGUID[0] <> $y Then
    $x = $aGUID[0]
    $y = $aGUID[1]
    ElseIf $aGUID[1] <> $x And $aGUID[1] <> $y Then
    $x = $aGUID[1]
    $y = $aGUID[0]
    EndIf

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

    _Mount_Drive($Drive_x, $x)
    _Mount_Drive($Drive_z, $z)

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

    Func _FindGUID($Drive)
    Local Const $DevList = 'HKLM\SYSTEM\MountedDevices'
    Local $i = 0
    Do
    If RegRead($DevList, '\DosDevices\' & $Drive) = RegRead($DevList, RegEnumVal($DevList, $i)) Then
    Return StringReplace(RegEnumVal($DevList, $i), '\??\', '\\?\', 1)
    EndIf
    $i += 1
    Until 0
    EndFunc ;==>_FindGUID

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

    Func _Unmount_Drive($Drive)
    $GUID = _FindGUID($Drive)
    $s_cmd = "mountvol " & $Drive & " /D"
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    Return $GUID
    EndFunc ;==>_Unmount_Drive

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

    Func _Mount_Drive($Drive, $GUID)
    If DriveGetType($Drive) = "" Then
    $s_cmd = "mountvol " & $Drive & " " & $GUID
    RunWait(@ComSpec & " /c " & $s_cmd, "", @SW_HIDE)
    Return 0
    Else
    Return 1
    EndIf
    EndFunc ;==>_Mount_Drive

    [/autoit]

    Gute Nacht!

  • Hi, musste dein Script leicht korrigieren ($y mit $z ersetzen)
    Wenn ich es im Windows teste, verschwinde jedoch Z.
    Scheint leider nicht zu funktionieren. ;(