I came across a function on StackOverflow and I'm trying to understand how the `.{process{ }}` block actually works. I'm curious if the dot is part of the Member-Access Enumeration and if the curly braces denote an expression or script block. Any insights would be greatly appreciated! Here's the function I'm looking at:
```powershell
function Get-Uninstall
{
if ([IntPtr]::Size -eq 4) {
$path = 'HKLM:SoftwareMicrosoftWindowsCurrentVersionUninstall*'
}
else {
$path = @(
'HKLM:SoftwareMicrosoftWindowsCurrentVersionUninstall*'
'HKLM:SoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*'
)
}
Get-ItemProperty $path |
.{process{ if ($_.DisplayName -and $_.UninstallString) { $_ } }} |
Select-Object DisplayName, Publisher, InstallDate, DisplayVersion, HelpLink, UninstallString |
Sort-Object DisplayName
}
```
5 Answers
You can think of the dot operator as a way to run the block within the same scope, which means variables modified inside will affect the outer context. The same is true for the ampersand, but the dot-sourcing operator also allows scope changes. This is useful when you want to maintain state or have global variables.
Just a heads-up: when using dot-sourcing, make sure to have a space right after the period, or it can throw off your entire command. Also, if you're confused about the mechanics, there's good documentation about operators in PowerShell that can clarify how these syntax rules work.
Thanks, everyone, for diving so deep into this! It’s refreshing to see such thorough peer support around these kinds of questions.
The leading dot is crucial here; it’s how you invoke that script block. Without it, you’re just defining the block, not running it. Alternatively, you could use the ampersand (`&`) operator which does the same thing but behaves differently with scopes. This choice can have implications depending on what you’re trying to accomplish with variable changes or context.
The `.{process{...}}` block is indeed a bit quirky. In PowerShell, functions (including script blocks) can have three types of blocks: begin, process, and end. This script block defines a `process` block which means it will execute for each item piped into it, as opposed to an `end` block which runs once after the pipeline completes. The leading dot is used for dot-sourcing, meaning it executes this block immediately rather than just defining it. Some might argue it’s more straightforward to use "ForEach-Object" instead, as that’s what this block is essentially doing. Also, just to clarify, there’s no need to use a leading dot like that; it's often seen as unnecessary syntax that can confuse people.
I agree, it's definitely a roundabout way to achieve the task when simpler tools exist! But I guess some just enjoy the complexity.

You make a good point! "Where-Object" would have been a clearer choice in this situation since it just filters items based on their properties, making the code easier to read.