foreach-object 是 powershell 中专为管道设计的命令式循环,通过 $_ 引用当前对象,支持脚本块、简化语法、begin/process/end 结构及 powershell 7+ 的 -parallel 并行处理。
powershell 中用 foreach-object 处理管道对象,核心是让每个流入的数据项都执行一段操作,它专为管道设计,不是用来遍历数组的语句式循环(那是 foreach 语句)。
基础用法:用 $_ 引用当前对象
管道中的每个对象会依次传入 ForEach-Object,在脚本块中用 $_ 表示它:
Get-Process | ForEach-Object { Write-Host "进程名:$($_.Name), CPU 使用:$($_.CPU)" }- 支持属性访问、方法调用、条件判断、字符串格式化等任意 PowerShell 表达式
- 脚本块内可写多行命令,建议缩进提升可读性
简化语法:直接写属性或方法名
如果只是提取属性值或调用无参方法,可省略脚本块和 $_:
-
Get-Service | ForEach-Object Name→ 输出每个服务的Name属性 -
Get-ChildItem *.log | ForEach-Object Delete→ 删除所有 .log 文件(注意权限和确认) - 这种写法简洁,但无法做条件判断或组合逻辑
结构化处理:Begin / Process / End 块
适合需要初始化、逐项处理、收尾汇总的场景:
Get-EventLog -Log System -Newest 100 | ForEach-Object -Begin { $errorCount = 0 } -Process { if ($_.EntryType -eq 'Error') { $errorCount++ } } -End { "共发现 $errorCount 个错误事件" }-
-Begin块只运行一次,常用于变量初始化 -
-Process块对每个对象执行(默认行为,可省略) -
-End块只运行一次,在全部处理完成后执行
并行加速:PowerShell 7+ 的 -Parallel 参数
当处理大量独立对象(如批量修改用户、远程调用)时,并行能显著提升效率:
$users | ForEach-Object -Parallel { Set-ADUser $_ -Department $Using:dept } -ThrottleLimit 10- 用
$Using:引用外部变量(如$dept),不能直接访问父作用域变量 -
-ThrottleLimit控制并发数,默认为 5;设太高可能压垮目标系统 - 每个并行任务在独立 Runspace 中运行,彼此隔离











