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)
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.

Listing configuration file locations (Image Credit: Jeff Hicks)
Listing configuration file locations (Image Credit: Jeff Hicks)
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)
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.
Listing virtual machines with invalid disk files (Image Credit: Jeff Hicks)
Listing virtual machines with invalid disk files (Image Credit: Jeff Hicks)
Or perhaps I want to check all virtual machines and insert a custom property that indicates if virtual disks exist.
Adding a custom property (Image Credit: Jeff Hicks)
Adding a custom property (Image Credit: Jeff Hicks)
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.
Better handling of missing disk files (Image Credit: Jeff Hicks)
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:
​
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)
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.
​
In this example, I am also grabbing the paths of each virtual disk file.
Listing problem virtual machines (Image Credit: Jeff Hicks)
Listing problem virtual machines (Image Credit: Jeff Hicks)
Although that's helpful information, that's a lot to type each time I want to test. In another article, I'll demonstrate how to take this a step further. As always, comments and questions are welcome.