I'm working on a PowerShell script that checks the free space on a specific drive across all domain controllers in our network. It runs fine most of the time, but recently I ran into an issue: our site-to-site link is down, which means the script throws an error when it cannot reach one of the domain controllers. I'm trying to use error handling in PowerShell, specifically with a try-catch block, to catch this error and log a friendly message instead, but I can't seem to get it to work correctly. Here's the line of code that's causing the error:
`$allDisks = @(Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='D:'" -ComputerName $allDCs)`
The error I'm getting suggests that the computer is inaccessible. I've tried using try-catch, but the error message still appears, and my custom message doesn't show up. Can anyone help me figure out how to catch this error in a way that informs the user without interrupting the whole script?
4 Answers
Try modifying your line to this:
`$allDisks = @(Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='D:'" -ComputerName $allDCs -ErrorAction Stop)`
This change will make the command throw an error that you can catch, ensuring your try-catch works properly.
Another option is to check if each domain controller is reachable before running `Get-CimInstance`. You can use `Test-Connection` (or `Test-NetConnection`) to verify connectivity first. That way, your script remains clean, and you avoid handling unnecessary errors later on.
While using `-ErrorAction` can help, in your case, you might want to collect all errors without stopping at the first one. You can utilize `-ErrorVariable` to capture all the errors that occur. Here’s how:
`$allDisks = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='D:'" -ComputerName $allDCs -ErrorVariable DiskErrors`
This way, you can log all connection issues without halting the script after the first failure, keeping your output clean.
Great point! `-ErrorVariable` is a fantastic choice. Just be mindful that errors will still show up in the host unless you add `-ErrorAction SilentlyContinue` to suppress them.
You might want to set the error action for your `Get-CimInstance` command. If you add the `-ErrorAction Stop` parameter, it will make the command behave correctly with your try-catch block. This means that if it fails, it will throw a terminating error that you can catch. Definitely worth a shot! Check out this link for more details: https://devblogs.microsoft.com/powershell/erroraction-and-errorvariable/
Yeah, that's right! PowerShell does have multiple levels of errors, and some might not be catchable. Using `-ErrorAction Stop` should help you force the errors to be terminating, which is exactly what you need.
Thanks for sharing that link! I plan to check it out later.

That sounds like a solid plan! I'll definitely try that approach. Thanks for the suggestion!