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