vik*_*ata 1 powershell foreach scriptblock
我有以下代码:
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
Run Code Online (Sandbox Code Playgroud)
第一个"f"调用成功,而%{}块显示错误:
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
Run Code Online (Sandbox Code Playgroud)
但为什么?ForEach-Object不支持begin/ process/ end块?
ForEach-Object 将各个块作为单独的命名参数.
在你的情况下,那将是:
1..10 |ForEach-Object -Begin {$count=0} -Process {$count+=10} -End {$count}
Run Code Online (Sandbox Code Playgroud)
这在帮助文件中有详细记录 - 来自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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1899 次 |
| 最近记录: |