Making decisions in PowerShell. In this weeks PowerShell tip of the week we will review ways we can use variables to help drive scripts conditionally. This means that when a variable it set to a certain value then a subsection code its either run or skipped. Thus we can use variables conditionally to make this happen.
Example 1
For this sample code, a PowerShell query is made using CIMInstance and it fails, a good fallback is Get-WMIObject. We can use a combo of Try and Catch and a variable to store a result. The variable will be used to either trigger a WMI query (if the CIM query fails) or to ignore the WMI query if the CIM query worked as expected.
First section of code attempts to query a server via a CIM Instance. If the query failed (Inside the Try section) the code section in the Catch section will be run, and in this case it will set a $WMIQuery variable to $True:
[sourcecode language=”powershell”]
Try {
$MaximumSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" -ErrorAction STOP| select-object MaximumSize).MaximumSize
} Catch {
$WMIQuery = $True
}
[/sourcecode]
Right after that the CIM query section, we can check the $WMIQuery variable to see it is true. If the variable is true (which it would be if the CIM query fails), then this code is executed:
[sourcecode language=”powershell”]
If ($WMIQuery) {
Try {
$MaximumSize = (Get-WMIObject -ComputerName $Server -Class win32_PageFileSetting -ErrorAction STOP | select-object MaximumSize).MaximumSize
} Catch {
$MaximumSize = 'Managed'
}
}
[/sourcecode]
Conditional variables can be used to create a determined flow in a script as well as be a part of error handling (Try {} Catch{}).
Example 2
In this next sample code block we will first set a variable ($Subscriptions) to $False. Then we will run a section of code to check to see if there are Edge Subscriptions (Edge Servers present in Exchange) and if the query fails, register this as no Edge subscriptions.
[sourcecode language=”powershell”]
$Subscriptions = $False Try { $EdgeSubscriptions = Get-EdgeSubscription -ErrorAction Stop | Select Name,Site,Domain,IsValid $Subscriptions = $True } Catch { $Line = 'No Edge Transport Servers or Subscriptions found.' | Out-File $Destination -Append }
[/sourcecode]
If the Get-EdgeSubscription succeeds and the $Subscriptions variable is changed from $False to $True. Once that variable set, we move on to another code section which will ONLY execute if the $Subscriptions variable is $True:
[sourcecode language=”powershell”]
If ($Subscriptions) { (Code to run) }
[/sourcecode]
This last section of code could be written a couple of ways:
[sourcecode language=”powershell”]
If ($Subscriptions) { }
[/sourcecode]
Or
[sourcecode language=”powershell”]
If ($Subscriptions -eq $True) {}
[/sourcecode]
Either way, if the $Subscriptions variable is $True, the code section in the brackets ( { } ) will execute. Now, we can also execute code if a variable false:
[sourcecode language=”powershell”]
If (!(Subscriptions) { }
[/sourcecode]
Or
[sourcecode language=”powershell”]
If ($Subscriptions -eq $False) {}
[/sourcecode]
** NOTE ** One thing to be careful of is that some cmdlets may not fail and only return a Null result, which would defeat the purpose of the Try{} Catch{} error handling. In cases like that, we may want to have an IF () check to see if a variable is Null instead. Still conditional because we are looking for a value to determine a course of action.
Example 3
In this last example, we can execute a code block based on what version of Exchange (or Windows) is running on a server. The first code section will determine the value for the $ExVersion variable:
[sourcecode language=”powershell”]
$ExVersion = $Null
If ($Version -like '*15.2*') {$ExVersion = '2019'}
If ($Version -like '*15.1*') {$ExVersion = '2016'}
If ($Version -like '*15.0*') {$ExVersion = '2013'}
If ($Version -like '*14.*') {$ExVersion = '2010'}
If ($Version -like '*8.*') {$ExVersion = '2007'}
[/sourcecode]
Once this variable is populated, we can then run a subset of code based on the value of the $ExVersion variable:
[sourcecode language=”powershell”]
If ($ExVersion -eq 2019) { }
If ($ExVersion -eq 2016) { }
If ($ExVersion -eq 2013) { }
[/sourcecode]
As we can see by the above examples, using a variables value to determine the direction of the script and what code to execute can be useful in some scenarios.