Using Floppy Disks with Windows Virtual PC

Most users of Windows Virtual PC do not need to use floppy disks with their virtual machines, as general usage of floppy disks has become rarer and rarer.  Those who do need to use floppy disks – may think that they can no longer do this – as there is no user interface for connecting floppy disks to virtual machines.

Do not be fooled.

Windows Virtual PC does support the use of floppy disks – but as this feature is only used by a small subset of users – we did not expose this in the user interface.  To use floppy disks you need to have a script to help you.  And here are the scripts:

VBScript:

 Option Explicit
  
 ' Define constants for floppy drive attachment types
 CONST vmFloppyDrive_None = 0
 CONST vmFloppyDrive_Image = 1
 CONST vmFloppyDrive_HostDrive = 2
  
 Dim namedArguments, argumentError, vpc, vm, vmName, action, floppy, vmFloppyDrive
  
 ' Check that the script is running at the command line.
 If UCase(Right(Wscript.FullName, 11)) = "WSCRIPT.EXE" Then
  WScript.Echo "This script must be run under CScript."
  WScript.Quit
 End If
  
 ' Get the virtual machine name / floppy commands from the command-line arguments
 Set namedArguments = WScript.Arguments.Named
  
 argumentError = false
  
 If namedArguments.Exists("vm") Then
  vmName = namedArguments.Item("vm")
 Else
  argumentError = true
 End If
  
 If namedArguments.Exists("action") Then
  action = namedArguments.Item("action")
 Else
  argumentError = true
 End If
  
 If namedArguments.Exists("floppy") Then
  floppy = namedArguments.Item("floppy")
 Else
  If (not ((action = "info") or (action = "disconnect"))) Then
   argumentError = true
  End If
 End If
  
 ' Display usage information if wrong arguments are provided
 if argumentError then
  WScript.Echo "Missing command-line argument"
  WScript.Echo
  WScript.Echo "Usage: FloppyDrive.vbs /vm:" & chr(34) & "Name of virtual machine to be started" & chr(34)
  WScript.Echo
  WScript.Echo "                       /action:info       - to display information about the current floppy configuration"
  WScript.Echo "                               disconnect - to disconnect any attached floppy disk or floppy disk image"
  WScript.Echo "                               vfd        - to attach a virtual floppy disk image"
  WScript.Echo "                               physical   - to attach a physical floppy disk"
  WScript.Echo
  WScript.Echo "                       /floppy:name       - where name is either the full name and path for a virtual"
  WScript.Echo "                                            floppy disk or the letter of a physical disk to attach"
  WScript.Echo
  WScript.Quit
 end if
  
 ' Attempt to connect to Virtual PC
 On Error Resume Next
 Set vpc = CreateObject("VirtualPC.Application")
 If Err.Number <> 0 Then
  WScript.Echo "Unable to connect to Virtual PC."
  WScript.Quit
 End if
 On Error Goto 0
  
 ' Get virtual machine object
 Set vm = vpc.FindVirtualMachine(vmName)
  
 ' Get the floppy drive
 set vmFloppyDrive = vm.FloppyDrives.item(1)
  
 ' Perform the specified action
 Select Case action
  
  ' Display floppy disk information
  case "info"
   wscript.echo "Floppy disk information"
   wscript.echo "======================="
  
   ' Different information is needed for each attachment type
   select case vmFloppyDrive.Attachment
    case vmFloppyDrive_None 
     wscript.echo "Floppy Attachment : No floppy disk attached"
     wscript.echo "Drive Number      : " & vmFloppyDrive.DriveNumber
    case vmFloppyDrive_Image 
     wscript.echo "Floppy Attachment : Floppy disk image attached"
     wscript.echo "Drive Number      : " & vmFloppyDrive.DriveNumber
     wscript.echo "Image File        : " & vmFloppyDrive.ImageFile 
    case vmFloppyDrive_HostDrive 
     wscript.echo "Floppy Attachment : Physical floppy disk attached"
     wscript.echo "Drive Number      : " & vmFloppyDrive.DriveNumber
     wscript.echo "Host Drive Letter : " & vmFloppyDrive.HostDriveLetter 
   end select
  
  ' Disconnect the current floppy disk
  case "disconnect"
  
   wscript.echo "Disconnecting the floppy disk."
  
   ' A different method is used to disconnect a floppy disk image than for a physical disk 
   select case vmFloppyDrive.Attachment
    case vmFloppyDrive_Image 
     vmFloppyDrive.ReleaseImage
    case vmFloppyDrive_HostDrive 
     vmFloppyDrive.ReleaseHostDrive
   end select
  
  ' Attach a floppy disk image
  case "vfd"
  
   wscript.echo "Attaching " & floppy & " to the floppy drive."
   vmFloppyDrive.AttachImage(floppy)
  
  ' Attach a physical floppy disk
  case "physical"
  
   wscript.echo "Attaching physical disk " & floppy & ": to the floppy drive."
   vmFloppyDrive.AttachHostDrive(floppy)
  
  ' Catch invalid actions
  case else
   wscript.echo "Invalid action provided. Info, disconnect, vfd and physical are valid options."
  
 end select
  
 wscript.echo

PowerShell:

 param([string]$vmName, [string]$action, [string]$floppy)
  
 $argumentError = 0
  
 # Check for correct command-line arguments
 If ($vmName -eq "")
  {$argumentError = 1}
  
 If ($action -eq "")
  {$argumentError = 1}
  
 If ($floppy -eq "")
  {
   if ((!([string]::Compare($action, "vfd", $True))) -or (!([string]::Compare($action, "physical", $True))))
   {$argumentError = 1}
  }
  
 # Display usage information if wrong arguments are provided
 If ($argumentError -eq 1)
  {
  write-host "Missing command-line argument."
  write-host "USage: FloppyDrive.ps1 -vmName `"Name of virtual machine`""
  write-host "                       -action info       - to display information about the current floppy configuration"
  write-host "                               disconnect - to disconnect any attached floppy disk or floppy disk image"
  write-host "                               vfd        - to attach a virtual floppy disk image"
  write-host "                               physical   - to attach a physical floppy disk"
  write-host
  write-host "                       -floppy name       - where name is either the full name and path for a virtual"
  write-host "                                            floppy disk or the letter of a physical disk to attach"
  exit
  }
  
 # Connect to Virtual PC
 $vpc=new-object –com VirtualPC.Application –Strict
  
 # Get virtual machine object
 $vm = $vpc.FindVirtualMachine($vmName)
  
 # Get the floppy drive
 $vmFloppyDrive = $vm.FloppyDrives.item(1)
  
 # Perform the specified action
 switch ($action) 
    {
  
    # Display floppy disk information
    "info" {
       write-host "Floppy disk information"
       write-host "======================="
  
       # Different information is needed for each attachment type
       switch ($vmFloppyDrive.Attachment)
         {
         0 {
            write-host "Floppy Attachment : No floppy disk attached"
            write-host "Drive Number      : " $vmFloppyDrive.DriveNumber}
         1 { 
            write-host "Floppy Attachment : Floppy disk image attached"
            write-host "Drive Number      : " $vmFloppyDrive.DriveNumber
            write-host "Image File        : " $vmFloppyDrive.ImageFile }
         2 { 
            write-host "Floppy Attachment : Physical floppy disk attached"
            write-host "Drive Number      : " $vmFloppyDrive.DriveNumber
            write-host "Host Drive Letter : " $vmFloppyDrive.HostDriveLetter }
         }
       }
  
    # Disconnect the current floppy disk
    "disconnect" {
  
       write-host "Disconnecting the floppy disk."
  
       # A different method is used to disconnect a floppy disk image than for a physical disk 
       switch ($vmFloppyDrive.Attachment)
          {
          1 {$vmFloppyDrive.ReleaseImage()}
          2 {$vmFloppyDrive.ReleaseHostDrive()}
          }
       }
  
    # Attach a floppy disk image
    "vfd" {
       write-host "Attaching " $floppy " to the floppy drive."
       $vmFloppyDrive.AttachImage($floppy)
       }
       
    # Attach a physical floppy disk
    "physical"  {
       write-host "Attaching physical disk " $floppy ": to the floppy drive."
       $vmFloppyDrive.AttachHostDrive($floppy)
       }
       
    # Catch invalid actions
    default {write-host "Invalid action provided. Info, disconnect, vfd and physical are valid options."}
    }

These scripts are fairly “self documenting” and will provide error messages if the wrong input is provided.  They will allow you to connect both physical and virtual floppy disks to a virtual machine.  As well as to check the information about the current floppy disk configuration.

I have also attached these scripts for download.

Cheers,
Ben

Floppy Drive Scripts.zip