‘Sup PSHomies,
I’m trying to get a grip on PowerShell Classes and all the new stuff we have available in version 5.
So June Blender posted this link in one of her tweets by @psCookieMonster. Guess Enum is a good place to start!
Using .NET enumerations to improve a user’s experience is definitely worth investing in, less error prone. I got a great tip how to create Custom Intellisense experience by @pcgeek86
I’ve used validation sets in the past. My “Aha” moment was the fact that you can just as easily typecast using the enumeration. You should check out powershell.com tip on the subject.
So I can create my own Enum and use it as a validation set? Let’s give it a try!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Enum PizzaSize { | |
Small = 10 | |
Medium | |
Regular | |
Large = 3 | |
ExtraLarge = 4 | |
} | |
function Get-PizzaSize{ | |
param( | |
[PizzaSize] | |
$PizzaSize | |
) | |
"You chose $PizzaSize" | |
} |
Hey! who doesn’t love a good pizza eh? 😉
Ok, there’s an upside and downside to this approach. The upside is that it keeps your code clean. The downside is that it has to be available prior to using. Another point to consider is that this is Syntax is only available in version 5.
Note: Enumerations are case-sensitive.
As luck would have it, I was perusing Microsoft’s pester scripts GitHub repository when I came across Pester for Classes! Here’s one from the pester scripts on Enumeration found in scripting.enums.tests.ps1
enum E3{ e0 e1 = 5 e2 = ([int]::MaxValue) - 1 e4 e3 = 1 # This shouldn't be an error even though previous member was max int }
So what’s going here? Well for starters I never paid much attention to the value being assigned. The first entry is assigned the value 0 if it hasn’t been given one. The second will be an increment of +1 of the first, that is, if it hasn’t been assigned another value.
So what are the current values?
[Enum]::GetValues('E3') | ForEach-Object {'{0} {1}' -f $_, ([E3]$_).value__ }
e2 has the MaxValue of [Int] minus one. e4 wasn’t assigned a value yet. Its value is an increment of e2 (the MaxValue of [Int]). If you try to add a new entry after e4, say e5, you’ll receive an error.
enum E3{ e0 e1 = 5 e2 = ([int]::MaxValue) - 1 e4 e5 e3 = 1 # This shouldn't be an error even though previous member was max int }
Have a look at the PizzaSize enumeration, what are the values actually?
[Enum]::GetValues('PizzaSize') | ForEach-Object {'{0}: {1}' -f $_, ([PizzaSize]$_).value__ }
Medium and Regular are incrementals of Small, Who knew! 😛
Want to make sure the enumeration has been defined?
[enum]::IsDefined([PizzaSize],'large') #Will be False case-sensitive [enum]::IsDefined([PizzaSize],'Large') #True [PizzaSize]10 #Returns Small [PizzaSize]3 #Returns Large #These will all return Large [PizzaSize]::Large [PizzaSize]'Large' [PizzaSize]3
How about if I wanted the value of the day of the week, say Saturday?
([System.DayOfWeek]'Saturday').value__ [Enum]::GetValues('System.DayofWeek') | ForEach-Object {'{0}: {1}' -f $_, ([System.DayofWeek]$_).value__ }
Well, off to a good start when it comes to Enumerations!
Hope it’s worth something to you…
Ttyl,
Urv