Blog

  • PowerShell Regex Matching

    I was working on a project where I needed to understand the naming convention for the servers. Since they had been made by several teams over several years, there was no convention. It was a giant pain in the ass.

    I wrote a function that would accept the server name and then try to parse it out. While there was not a strong standard, there was a few soft standards I could guess at. It took a while to figure out but PowerShell -match returns an array, if you use regex groups. All I needed was a few regex patterns and then I could start to decode these server names!

    The servers were in different data centers, so some had DEN, ’cause they were in Denver data center (see?). But some were in CINC (with four letters, not even keeping three letters) as they were in the Cincinnati data center. The next few characters in the name gave some hint as to purpose; WEB, or SQL or something more obscure like OTOPS, again with varying number of letters. Last, the server could have a number, 01, 02, etc. or a letter, A, B, C if it was part of a set. But then we had a few that were part of 01 set but there were several of those so you got 01A, 01B, 01C.

    There are several great regex tools on-line to show you how your pattern is working and what the rules are. For the server names I wound up with:

    (?<datacenter>den|cinc)(?<role>\w+)(?<countNum>\d{2})(?<countLet>[a-d])

    PowerShell isn’t case sensitive, so we’ll ignore those differences. Also, I’m using named groups, those are defined with ?<datacenter> where the name of the group is data center. Then everything that matches within the ( ) for that group winds up in $Matches.datacenter. $Matches is a built-in variable and can be referenced by index number if not using named groups.

    switch -regex ($serverName){
      "(?<datacenter>den|cinc)(?<role>\w+)(?<countNum>\d{2})(?<countLet>[a-f])" {
        $datacenter = $Matches.datacenter
        $role       = $Matches.role
        $countNum   = $Matches.countNum
        $countLet   = $Matches.countLet
        break
      }
      "(?<datacenter>den|cinc)(?<role>\w+)(?<countNum>\d{2})" {
        $datacenter = $Matches.datacenter
        $role       = $Matches.role
        $countNum   = $Matches.countNum
        $countLet   = "None"
        break
      }
    }

    This is what I wound up with; the switch takes the name of the server passed to my function, checks it against a few different regex patterns, and where there is a match for all groups of the pattern, executes the code block.

    In the code block I’m pulling the named group and assigning to my values to spit out at the end of the function. Additionally, you see the second pattern is for when there are only numbers in the name. In the running code I had a few more patterns to match all the options used when creating servers. Note the break in the script block, that’s because the switch will keep matching patterns all the way down the statement! The second pattern will give me “None” for my count letter value and not an error or something unexpected.

    I didn’t figure all this out on my own, Kevin’s article on Regex showed me the way. You can get the details on named groups here.

  • Transport Truck

    With a Firetruck, and a Fast Car, I wasn’t quite done with the floating vehicle idea. I wanted to try again, a different way, to get the wheel-arch on top and bottom. Once I had a chassis, it seemed like a box van was the way to finish it off. A small cab and a nice sized container behind. I found the flip up doors and that part started to come together. After building it once, I decided to try and get a brick-built diagonal color in there. The two slope pieces don’t quite join up as I would like but don’t seem horrible.

    I seem to have found lots of plants while sorting so I put a few flowers in there and crates of carrots to make this a vegetable delivery truck. The fancy guy in selling (or buying?) isn’t happy with the delivery driver though.

  • Small Ship on Platform

    Another small ship; I like making them as they are easy and don’t require a huge commitment on my part. This one I recall taking apart more than a dozen times to get just the right combination. It was made a few years ago when I saw someone else’s “monkey arm steering” controls in a vertical style. I revised it a few more times, as noted, and just recently remade the platform to display it on.

    I was sorting my collection and pulled out all the plant stuff, so this gave some interest to the base. Then, the platform was just a plate on the girder brick so I embellished that. I found a nice way to put a little ladder up to the cockpit and attached a hose for visual appeal.