2010-07-04 14 views
7

Utilizzando la libreria WMI di Windows, come posso espellere un CD rom montato su una specifica unità CD/DVD?Come espellere il CD usando WMI e Python?

Sto chiedendo le fonti da documenti WMI o esempi poiché sto usando la libreria wmi.py su Python.

Sarebbe bello se la soluzione soddisfi i computer Windows più recenti di Windows 2000 e con più CD-ROM. (Ad esempio, ho D: F: drive ed entrambi sono unità CD-ROM. Potrei voler espellere cd in F: specificatamente.)

Ho cercato in rete ma non ho trovato nulla di rilevante. L'ultima soluzione deve avere binari di terze parti e l'esecuzione dalla shell.

+0

non si può farlo con WMI. –

+0

sì, sembra così. –

risposta

9

È possibile utilizzare ctypes.

import ctypes 

ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door open", None, 0, None) 

UPDATE:

Se si dispone di più di un disco, è possibile utilizzare per open comando per inizializzare un dispositivo specifico prima di chiamare la funzione di cui sopra. Ad esempio (non testato).

ctypes.windll.WINMM.mciSendStringW(u"open D: type cdaudio alias d_drive", None, 0, None) 
ctypes.windll.WINMM.mciSendStringW(u"set d_drive door open", None, 0, None) 

Inoltre, vedere la documentation su come controllare il ritorno dei valori

+0

interessante, non ha funzionato per me. stampa solo 0 su console. Ho 2 unità CD-ROM. D: e F :, D: per immagini ISO montate in modo virtuale, e F: per il vero drive cdrom. Forse è la ragione? –

+0

È possibile utilizzare il comando di apertura per inizializzare un'unità specifica. Ho aggiornato la risposta di conseguenza. – Garett

+1

Ho trovato il problema. Se monto 2 CD-ROM (diciamo D: e F :) e D: (prima nell'ordine di apparenza) non è un drive ejectable (come il montaggio virtuale) non uscirà e per quanto ho osservato, nulla risolve questo . Tuttavia, se disattivo questa unità e utilizzo il vassoio fisico, funziona! Grazie. –

2

WMI non fornisce mezzi per espellere unità CD/DVD. Ci sono altre soluzioni, però, che comportano l'uso di funzioni API di Windows, ad esempio:

  • Utilizzando la funzione mciSendString. Non si può aiutare con il codice Python, ma ecco l'esempio C# per aiutarvi a ottenere l'idea:

    mciSendString("open f: type cdaudio alias cdrom", null, 0, IntPtr.Zero); 
    mciSendString("set cdrom door open", null, 0, IntPtr.Zero); 
    
  • Utilizzando la funzione DeviceIOControl. Un esempio (anche in C#) è here.