I've got the following code:
function f()
{
begin{$count=0}
process{$count+=10}
end{$count}
}
1..10|f # OK
1..10|%{
begin{$count=0}
process{$count+=10}
end{$count}
} # Error
The first "f" call succeeds, while the %{} block shows error:
100
% : The script block cannot be invoked because it contains more than one clause. The Invoke() method can only be used on script blocks that contain a single clause.
At D:\Untitled1.ps1:13 char:7
+ 1..10|%{
+ ~~
+ CategoryInfo : InvalidOperation: (:) [ForEach-Object], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.ForEachObjectCommand
But why? ForEach-Object doesn't support begin/process/end blocks?
ForEach-Object takes the individual blocks as separate named parameters.
In your case, that would be:
1..10 |ForEach-Object -Begin {$count=0} -Process {$count+=10} -End {$count}
This is well documented in the help files - from Get-Help ForEach-Object -Parameter *:
-Begin <ScriptBlock>
Specifies a script block that runs before processing any input objects.
Required? false
Position? named
Default value None
Accept pipeline input? false
Accept wildcard characters? false
-End <ScriptBlock>
Specifies a script block that runs after processing all input objects.
Required? false
Position? named
Default value None
Accept pipeline input? false
Accept wildcard characters? false
<# ... #>
-Process <ScriptBlock[]>
Specifies the operation that is performed on each input object. Enter a script
block that describes the operation.
Required? true
Position? 1
Default value None
Accept pipeline input? false
Accept wildcard characters? false
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With