A friend asked me earlier this week if I could provide a PowerShell solution for him. The task called for searching all sub folders under a root in the registry and updating a specific key name to a new value.
This sounded like fun and something easily handled, but it turned out to be rather difficult to provide a solution. I floundered for a while trying to understand his requirements. He finally thought to send me a reg file so I could test with the keys he needed.
Suddenly my eyes were opened and things went much smoother. I had a list of keys now, but a lot of long code that didn’t work well for the update task. Eventually I had a concise, simple solution, but I’m a bit embarrassed to say that it took me much longer than I had planned.
Background
This problem was specifically for Putty, which I had never heard of before this week. I still know basically nothing about it, except that it was made by this guy because his name is in the registry path. (clever way to make sure everyone knows who created your software)
You can use my final solution at the bottom to get and update Putty’s registry properties. I assume that’s useful, my friend seemed to be happy with it. For non-Putty users, you may have some need to search the registry for a key that you know exists but are not sure exactly where it is located. The Get
statement can help you out there, since searching in regedit can be quite slow. I haven’t fathomed a scenario where I would need to update all like-named keys to a new identical value outside of Putty though.
The Script
Originally, my plan was to just use the following code for a fast solution.
Get-ItemProperty -Path $Path -Recurse
That’s not actually valid code though.
So I started working on a horrific work-around involving ForEach
statements and lots of piping. I eventually had a solution to get all the keys, but then updating them from that list did not work, so I went back to the basics, and realized it was a very easy query.
You can search the registry using Get-ItemProperty
or Get-ChildItem
. The latter has pros and cons though. While you can use -Recurse
with it, the results are a bit uglier to read and why I was originally avoiding it. I also assumed that I could not Set
values that were piped from it. However, in this case, it is the superior method. I have included a before and after Get
statement in the working script so that you can see the keys you are about to update before, and then verify the new values afterwards.
Disclaimer: I apologize if this code has dreadful formatting, WordPress was ignoring my line breaks while I used an outdated browser.
## Set Variables $Path = "HKCU:\Software\SimonTatham\Putty\Sessions" $Key = "LogFileName" $NewValue = "C:\text.txt" ### Check Existing Values Get-ChildItem $Path | Get-ItemProperty -Name $Key | Select PsChildName,LogFileName ### Update Values Get-ChildItem $Path | Set-ItemProperty -Name $Key -Value $NewValue ### Verify New Values Get-ChildItem $Path | Get-ItemProperty -Name $Key | Select PsChildName,LogFileName