#PowerShell 的 ForEach-Object 命令
ForEach-Object
[-Process] <ScriptBlock[]>
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
[-MemberName] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
-Parallel <ScriptBlock>
[-InputObject <PSObject>]
[-ThrottleLimit <Int32>]
[-TimeoutSeconds <Int32>]
[-AsJob]
[-UseNewRunspace]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
功能
对输入集合中的每个对象执行指定操作,可用于遍历、转换和并行处理管道数据。
类型
Cmdlet,属于 Microsoft.PowerShell.Core。
参数
[-Process] <ScriptBlock[]>- 对每个输入对象执行的脚本块,$_表示当前对象;位置 0-InputObject <PSObject>- 要处理的对象,通常通过管道传入-Begin <ScriptBlock>- 在处理任何输入之前只执行一次的脚本块-End <ScriptBlock>- 在处理完所有输入之后只执行一次的脚本块-MemberName <String>- 要获取的属性名或要调用的方法名;位置 0-ArgumentList <Object[]>- 调用方法时传递的参数数组-Parallel <ScriptBlock>- 并行处理输入对象的脚本块;需要 PowerShell 7.0 及以上版本-ThrottleLimit <Int32>- 并行执行的最大脚本块数量,默认值为 5-TimeoutSeconds <Int32>- 并行处理的超时秒数,0表示不超时-AsJob- 将并行处理作为后台作业运行-UseNewRunspace- 为每次并行迭代创建新的运行空间
并行脚本块不能直接访问外部变量,需要使用
$using:作用域修饰符传递。
#示例
遍历并处理每个对象
> 1..5 | ForEach-Object { $_ * 2 }
2
4
6
8
10
$_表示管道中的当前对象。
获取属性值
> Get-Process | ForEach-Object { $_.ProcessName }
> Get-Process | ForEach-Object ProcessName
- 第二条命令使用简化的
-MemberName语法,两条命令结果相同。
调用对象方法
> 'a.md', 'b.txt' | ForEach-Object -MemberName Split -ArgumentList '.'
-MemberName指定方法名,-ArgumentList传入方法参数。
使用 Begin、Process 和 End
> 1..5 | ForEach-Object -Begin { $sum = 0 } -Process { $sum += $_ } -End { $sum }
15
-Begin在处理前执行一次,-Process对每个对象执行,-End在处理后执行一次。
并行处理
> 1..8 | ForEach-Object -Parallel {
"$Using:prefix $_"
} -ThrottleLimit 4
-Parallel需要 PowerShell 7.0 及以上版本,-ThrottleLimit限制同时运行的脚本块数量。- 并行输出不保证顺序,共享状态应使用线程安全的数据结构。