#PSTip Ejecting and closing CDROM drive–the PowerShell way!

Note: This tip requires PowerShell 2.0 or above.

I came across a project on Github (nothing related to PowerShell though) that provides a web-based UI for running system commands. This is based on Node.js implementation and does not support Windows platform yet. So, I was thinking about adding some PowerShell support.

I started discussing this with a few folks and they suggested an alternative for running system commands on Windows. While looking at that, I stumbled upon the CDROM eject and close commands supported by this 3rd-party tool. I wanted to see how easy that is to do in PowerShell. So, here is what I came up with.

Add-Type -TypeDefinition  @'
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace CDROM
{
    public class Commands
    {
        [DllImport("winmm.dll")]
        static extern Int32 mciSendString(string command, string buffer, int bufferSize, IntPtr hwndCallback);
        public static void Eject()
        {
             string rt = "";
             mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
        }

        public static void Close()
        {
             string rt = "";
             mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero);
        }
    }
}
'@

[CDROM.Commands]::Eject()
[CDROM.Commands]::Close()

The above snippet uses the .NET interop namespace to invoke a Win32 API for working with multimedia devices. Btw, I came across several blog posts on using WScript Shell and Windows Media Player OCX to achieve this task. But, like I mentioned, this is more PowerShell way of doing it. Drop a comment if you are aware of any alternative methods.

Share on: