Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I cannot use begin/process/end block in a ForEach-Object?

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?

like image 420
vik santata Avatar asked Mar 05 '26 07:03

vik santata


1 Answers

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
like image 186
Mathias R. Jessen Avatar answered Mar 06 '26 21:03

Mathias R. Jessen



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!