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.
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. But unless the virtual machine is running without error, I really don't know. One thing I can do is test each path.
Or perhaps I want to check all virtual machines and insert a custom property that indicates if virtual disks exist.
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.
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. 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. 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.