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 来访问该属性。