Prof. Powershell
Practical PowerShell Part 2: Property Value
This week Prof. PowerShell shows you how to retrieve dynamic property values.
- By Jeffery Hicks
- 07/15/2014
More on this topic:
In last week's lesson we started exploring a PowerShell command and identifying ways to use it. If you want to follow along, open a command prompt and run through the command line examples from the last article to get caught up.
I need to verify that I can retrieve the value from each dynamic property. Here's a quick recap of where we're at:
PS C:\> $regentry = Get-ItemProperty -Path HKLM:\SOFTWARE\RegisteredApplications | Select -Property * -ExcludeProperty $exclude
PS C:\> $props = $regentry.psobject.properties.name
The $props variable contains an array of property names for things in $regentry.
PS C:\> $props[0]
Paint
How about a quick test?
PS C:\> $regentry.$($props[0])
SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Paint\Capabilities
Excellent. Remember, my goal is to also get some information from the corresponding value. I am assuming this path is relative to HKLM so I will use Join-Path to construct a valid path which I can use with Get-Item.
PS C:\> Join-Path HKLM: $regentry.$($props[0]) | Get-Item
Or if I just want the properties:
PS C:\> Join-Path HKLM: $regentry.$($props[0]) | Get-ItemProperty | Select App*
Now that I've proved how to do something for one item in my list of registered applications I can do it for all using ForEach-Object.
foreach ($entry in $props) {
$valuepath = Join-Path -path "HKLM:" -child $regentry.$entry
Get-ItemProperty -Path $valuePath | Select App*
}
As you can see in Figure 3, it is possible some applications may not have anything at the specified location. I will have to handle that error when it comes time to build a reusable script. I always prefer writing objects to the pipeline. I could take what I have discovered so far and use Select-Object to create a custom object for each registered application.
$props | Select @{Name="Application";Expression={$_}},
@{Name="Entry";Expression={$regentry.$_}},
@{Name="Name";Expression={
(Join-Path -path "HKLM:" -child $regentry.$_ | Get-ItemProperty).ApplicationName}},
@{Name="Description";Expression={
(Join-Path -path "HKLM:" -child $regentry.$_ | Get-ItemProperty).ApplicationDescription}}
As you can see in Figure 4 this works, although perhaps it isn't that easy to follow. The $_ place holder is the name of each registered application which is used as a dynamic property of the previously created $regentry variable. Of course I could add and delete properties at will. Although personally, I have a goal to write or use a command only once and in this instance I am creating the same path and getting the same registry property twice. Yes, the performance hit is negligible, but I prefer something a bit more efficient. That is what we will look at next time.
About the Author
Jeffery Hicks is an IT veteran with over 25 years of experience, much of it spent as an IT infrastructure consultant specializing in Microsoft server technologies with an emphasis in automation and efficiency. He is a multi-year recipient of the Microsoft MVP Award in Windows PowerShell. He works today as an independent author, trainer and consultant. Jeff has written for numerous online sites and print publications, is a contributing editor at Petri.com, and a frequent speaker at technology conferences and user groups.