ForEach-Object

针对每一组输入对象执行操作。

语法

ForEach-Object [-Process] <ScriptBlock[]> [-Begin <scriptblock>] [-End <scriptblock>] [-InputObject <psobject>] [<CommonParameters>]

说明

ForEach-Object cmdlet 对一组输入对象中的每个对象执行操作。输入对象可以以管道形式传入 cmdlet,或使用 InputObject 参数指定输入对象。

在作为 Process 参数的值提供给 cmdlet 的脚本块中描述了要执行的操作。脚本块可以包含任何 Windows PowerShell 脚本。

在脚本块中,使用 $_ 变量表示当前输入对象。

除了使用描述要对每个输入对象执行何种操作的脚本块以外,还可以另外提供两个脚本块。一个(指定为 Begin 参数的值)运行于处理第一个输入对象之前。另一个(指定为 End 参数的值)运行于处理最后一个输入对象之后。

所有脚本块的计算结果(包括使用 Begin 和 End 指定的结果)都将传入管道。

参数

-Begin <scriptblock>

指定在处理任何输入对象之前要运行的脚本块。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-End <scriptblock>

指定在处理完所有输入对象之后要运行的脚本块。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-InputObject <psobject>

接受在 process 参数中指定的脚本块的对象。输入一个包含对象的变量,或键入可获取对象的命令或表达式。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

true (ByValue)

是否接受通配符?

false

-Process <ScriptBlock[]>

指定应用于每个传入对象的脚本块。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

false

是否接受通配符?

false

<CommonParameters>

此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.

输入和输出

输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。

输入

System.Management.Automation.PSObject

可以通过管道将任何对象传递给 ForEach-Object。

输出

System.Management.Automation.PSObject

ForEach-Object 返回的对象由输入确定。

示例 1

C:\PS>30000,56798,12432 | foreach-object -process {$_/1024}

说明
-----------
此命令接受整数数组,然后将其中每个整数除以 1024,然后显示结果。





示例 2

C:\PS>get-childitem C:\ | foreach-object -process { $_.length / 1024 }

说明
-----------
此命令检索 C: 驱动器的根目录中的文件和目录,然后返回并显示它们每一项的大小。零表示其中文件大小不可用的目录。





示例 3

C:\PS>$events = get-eventlog -logname system -newest 1000

C:\PS> $events | foreach-object -begin {get-date} -process {out-file -filepath events.txt -append -inputobject $_.message} -end {get-date}

说明
-----------
此命令从系统日志中检索 1000 个最近事件,并将它们存储在 $events 变量中。然后,通过管道将事件传递给 ForEach-Object cmdlet。Begin 参数显示当前日期和时间。接着,Process 参数使用 Out-File cmdlet 来创建名为 events.txt 的文本文件,并将每个事件的消息属性存储在该文件中。最后,在完成所有处理之后,使用 End 参数显示日期和时间。





示例 4

C:\PS>get-itemproperty -path hkcu:\Network\* | foreach-object {set-itemproperty -path $_.pspath -name RemotePath -value $_.RemotePath.ToUpper();}

说明
-----------
此命令将 HKCU:\Network 项的所有子项中 RemotePath 注册表条目的值更改为大写文本。可以使用此格式更改注册表条目值的形式或内容。

Network 项中的每个子项都表示将在登录时重新连接的映射的网络驱动器。RemotePath 项包含连接的驱动器的 UNC 路径。例如,如果将 E: 驱动器映射到 \\Server\Share,将存在 HKCU:\Network 的一个子项 E,并且 E 子项中 RemotePath 注册表条目的值将为 \\Server\Share。

该命令使用 Get-ItemProperty cmdlet 来获取 Network 项的所有子项,使用 Set-ItemProperty cmdlet 来更改每项中的 RemotePath 注册表条目的值。在 Set-ItemProperty 命令中,路径为该注册表项的 PSPath 属性的值。(这是表示该注册表项的 Microsoft .NET Framework 对象的一个属性,而不是一个注册表条目)。该命令使用 RemotePath 值的 ToUpper() 方法,前者是一个字符串 (REG_SZ)。

因为 Set-ItemProperty 更改每一项的属性,所以需要 ForEach-Object cmdlet 来访问该属性。