It works...but is it right ?

This topic contains 2 replies, has 3 voices, and was last updated by Profile photo of Graham Beer Graham Beer 1 year, 5 months ago.

  • Author
  • #25367
    Profile photo of Graham Beer
    Graham Beer

    As part of our OSD deployment we need to find a way of installing a bunch of "hotkey" for certain models. I've written this script tonight (Ignore the output result of Wrong or right, its a test !) and it works but something doesn't feel right about the double curly braces on each line. Have i done this the correct way ?

    # This script will detect the machine model and then install the hotkeys for that model
    $model = (Get-CimInstance -Namespace ROOT\cimv2 -ClassName Win32_ComputerSystem).Model
    Switch -Wildcard ($Model) {
     { $_ -contains "HP EliteBook 8460p" } { write-output "Wrong!"; break }
     { $_ -contains "HP EliteBook 8470p" } { write-output "Right!!"; break }
     { $_ -contains "HP EliteBook 2170p" } { write-output "Wrong!"; break }
     { $_ -contains "HP EliteBook 2570p" } { write-output "Wrong!"; break }
     { $_ -contains "HP EliteBook 840 G1" } { write-output "Wrong!"; break }
     { $_ -contains "HP EliteBook 840 G2" } { write-output "Wrong!"; break }
    Default { "Unknown Model type" }

    Many thanks as always.

  • #25368
    Profile photo of Don Jones
    Don Jones

    So... -contains isn't really the right operator, no. It's not a wildcard operator, which is how you seem to be using it. I think you're after -like. -Contains is a bit more complicated, as it's meant to look for items in a collection. Win32_ComputerSystem never actually turns a collection, and the Model property is just a string.

    And you're kinda not using the Switch construct correctly.

    switch -wildcard ($model) {
      "HP EliteBook 8460p" { # do something }
      "HP EliteBook 8470p" { # do something }

    That's actually the structure I'd expect to see, given what I think you're trying to achieve. The conditions on a Switch construct aren't necessarily meant to be entire comparisons; Switch is what DOES the comparison, in this case a wildcard string comparison, since you've used -Wildcard. You're comparing what's in $Model with specific values. Now, as you've noted, what you've done can work – but the structure you've used is intended for more complex situations; for what you're doing, it's overkill.

  • #25370
    Profile photo of Graham Beer
    Graham Beer

    Thank you Don that's very helpful. It didn't feel right so I'm glad I queried it. It's hard learning powershell as you think you've grasped something and find its not used in the right way! By all this is very helpful and I appreciate your good self replying.

You must be logged in to reply to this topic.