Testing Hyper-V Disk Health

I use Hyper-V extensively to provide a domain environment that serves as my training and test playground. And because my environment has to be portable, I tend to run into more problems than hopefully you do. However, you might still benefit from experiences and maybe you will learn something about PowerShell along the way. If a virtual machine is already running, I’m not too concerned about it. Instead, I need a heads up on all my other virtual machines, especially if there is a problem that would keep them from starting.

Using the Hyper-V module, grabbing all virtual machines is pretty easy.

Getting virtual machine status (Image Credit: Jeff Hicks)

As you can see, I have one virtual machine with a critical problem, which is because the virtual machine configuration file is missing or corrupt. The configuration file is an XML file named with the virtual machine’s ID. I can confirm that the file is missing.

That’s a pretty easy thing to check and fix. What’s a bit harder is verifying that the virtual disk files, which include vhd and vhdx files, are all in place. I can easily see what the files should be.

Listing virtual machine disk files (Image Credit: Jeff Hicks)

But unless the virtual machine is running without error, I really don’t know. One thing I can do is test each path.

There is one slight wrinkle with this approach. The virtual machine called demo doesn’t have any virtual disks defined, so I don’t get any results. Let me refine the command to take this into account.

PowerShell

1

2

3

4

5

6

7

8

9

10

Get-VM|SelectName,State,

@{Name="TestVHD";Expression={

if($_.HardDrives){

$_|Get-VMHardDiskDrive|Test-Path

}

else{

#no hard drive files configured

$false

}}},

Status

Better handling of missing disk files (Image Credit: Jeff Hicks)

That’s better. Although for virtual machines with multiple disk files, my custom property is an array, as you can see for Nano-01. Eventually I want to get to a point where I can filter on the TestVHD property. For my purposes, all disks must test as true, otherwise I’ll treat the entire test as a failure. Here’s how I might accomplish this:

PowerShell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Get-VM|SelectName,State,

@{Name="TestVHD";Expression={

$test=@()

if($_.HardDrives){

$test+=$_|Get-VMHardDiskDrive|Test-Path

}

else{

#no hard drive files configured

$test+=$false

}

if($test-contains$False){

$False

}

else{

$True

}

}},

Status

I initialize a variable, $test, to hold the values from Test-Path. Next, I test using the –Contains operator to see if $test has any values of $False. If so, then the value for TestVHD should be false.

Testing for multiple disk files (Image Credit: Jeff Hicks)

That’s much better. Now I can get a better feel for what virtual machines need attention.