foreach-object 是 powershell 中处理管道对象的核心 cmdlet,支持 $_ 引用当前对象、% 别名、属性提取简化语法、begin/process/end 多阶段处理、powershell 7+ 的 -parallel 并行执行(需 $using: 传参)、条件过滤及方法调用等灵活操作。
powershell 中的 foreach-object 是处理管道对象最核心的 cmdlet 之一,它让每个流入的对象都能被单独、灵活地操作。
基础用法:用 $_ 引用当前对象
管道中的每个对象会依次传入 ForEach-Object 的脚本块,用自动变量 $_ 表示当前对象:
Get-Process | ForEach-Object { Write-Host "进程名:$($_.ProcessName), ID:$($_.Id)" }- 简写形式也常用:
Get-Process | % { $_.ProcessName }(%是ForEach-Object的别名) - 更简洁的属性提取可省略脚本块:
Get-Process | ForEach-Object ProcessName—— 这是简化语法,直接返回指定属性值
带 Begin/Process/End 的多阶段处理
适合需要初始化、逐项处理、收尾汇总的场景:
Get-Service | ForEach-Object -Begin { $count = 0; Write-Host "开始统计..." } -Process { if ($_.Status -eq 'Running') { $count++ } } -End { Write-Host "共 $count 个运行中服务" }-
-Begin块只执行一次,常用于定义变量或输出提示 -
-Process是默认参数,可省略;对应每个对象执行一次 -
-End块在所有对象处理完后执行一次,适合汇总或清理
并行处理:PowerShell 7+ 的 -Parallel 参数
当对象数量大、操作耗时(如远程调用、文件处理),可用 -Parallel 提升效率:
$users | ForEach-Object -Parallel { Set-ADUser $_ -Department "IT" } -ThrottleLimit 10- 必须使用 PowerShell 7.0 或更高版本;Windows PowerShell 5.1 不支持
- 并行块内不能直接访问外部变量,需用
$using:variable显式传递,例如:-Parallel { Set-ADUser $_ -Department $using:dept } -
-ThrottleLimit控制并发数,默认为 5,可根据 CPU 和 I/O 负载调整
结合条件与方法调用增强实用性
ForEach-Object 内部可写任意 PowerShell 逻辑,不局限于简单输出:
- 条件过滤:
Get-ChildItem *.log | ForEach-Object { if ($_.LastWriteTime -lt (Get-Date).AddDays(-7)) { Remove-Item $_ -Force } } - 调用对象方法:
Get-Process notepad | ForEach-Object { $_.Kill() } - 组合多个语句(注意缩进提升可读性):
Get-Service | ForEach-Object { $name = $_.Name; $status = $_.Status; Write-Verbose "$name → $status" -Verbose }











