约 2495 字

约 12 分钟

#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 - 为每次并行迭代创建新的运行空间

#示例

遍历并处理每个对象

> 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 限制同时运行的脚本块数量。
  • 并行输出不保证顺序,共享状态应使用线程安全的数据结构。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2