ForEach-Object

对输入对象集合中的每个项执行操作。

语法

ScriptBlockSet (默认值)

ForEach-Object
    [-Process] <ScriptBlock[]>
    [-InputObject <PSObject>]
    [-Begin <ScriptBlock>]
    [-End <ScriptBlock>]
    [-RemainingScripts <ScriptBlock[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

PropertyAndMethodSet

ForEach-Object
    [-MemberName] <String>
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

说明

ForEach-Object cmdlet 对输入对象集合中的每个项执行操作。 可以通过管道将输入对象传递给 cmdlet,也可以使用 InputObject 参数指定。

从 Windows PowerShell 3.0 开始,可通过两种不同的方法来构造 ForEach-Object 命令。

  • 脚本块。 可以使用脚本块来指定作。 在脚本块中,使用 $_ 变量来表示当前对象。 脚本块是 Process 参数的值。 脚本块可以包含任何 PowerShell 脚本。

    例如,以下命令获取计算机上的每个进程的 ProcessName 属性的值。

    Get-Process | ForEach-Object {$_.ProcessName}

  • Operation 语句。 还可以编写一个操作语句,这更像是自然语言。 可以使用 operation 语句指定属性值或调用方法。 Windows PowerShell 3.0 中引入了操作语句。

    例如,以下命令还获取计算机上的每个进程的 ProcessName 属性的值。

    Get-Process | ForEach-Object ProcessName

    使用脚本块格式时,除了使用描述对每个输入对象执行的操作的脚本块外,还可以提供另外两个脚本块。 Begin 脚本块(Begin 参数的值)在此 cmdlet 处理第一个输入对象之前运行。 End 脚本块(End 参数的值)在此 cmdlet 处理最后一个输入对象之后运行。

示例

示例 1:在数组中除整数

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625

此命令采用三个整数的数组,并将其中每个整数除以 1024。

示例 2:获取目录中所有文件的长度

Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

此命令获取 PowerShell 安装目录中 $pshome 的文件和目录,并将其传递给 ForEach-Object cmdlet。 如果对象不是目录,则脚本块获取文件的名称,将 Length 属性的值除以 1024,并添加一个空格(“”)以将其与下一项分开。 该 cmdlet 使用 PSISContainer 属性来确定对象是否为目录。

示例 3:对最新的系统事件进行作

$Events = Get-EventLog -LogName System -Newest 1000
$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:更改注册表项的值

Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}

此命令将 HKCU:\Network 键下的所有子项中 RemotePath 注册表项的值更改为大写文本。 可以使用此格式更改注册表项值的窗体或内容。

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

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

由于 Set-ItemProperty 更改每个键的属性,因此访问该属性需要 ForEach-Object cmdlet。

示例 5:使用$Null自动变量

1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello

此示例显示将 $Null 自动变量管道到 ForEach-Object cmdlet 的效果。

由于 PowerShell 将 null 视为显式占位符,因此 ForEach-Object cmdlet 会生成 $Null的值,就像对传递给它的其他对象一样。

有关 $Null 自动变量的详细信息,请参阅about_Automatic_Variables。

示例 6:获取属性值

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

这些命令获取所有已安装 PowerShell 模块的 Path 属性的值。 它们使用 MemberName 参数指定模块的 Path 属性。

第二个命令等效于第一个命令。 它使用 cmdlet 的 ForEach-Object 别名,并省略 MemberName 参数的名称(可选)。

ForEach-Object cmdlet 对于获取属性值非常有用,因为它获取的值而不更改类型,这与 Format cmdlet 或更改属性值类型的 Select-Object cmdlet 不同。

示例 7:将模块名称拆分为组件名称

"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host

这些命令将两个点分隔的模块名称拆分为其组件名称。 这些命令调用字符串的 Split 方法。 这三个命令使用不同的语法,但它们等效且可互换。

第一个命令使用传统语法,其中包括脚本块和当前对象运算符 $_。 它使用点语法来指定方法和括号以将分隔符参数括起来。

第二个命令使用 MemberName 参数指定 Split 方法和 ArgumentName 参数,以将点(“.”)标识为拆分分隔符。

第三个命令使用 Foreach-Object cmdlet 的 Foreach 别名,并省略 MemberNameArgumentList 参数的名称(可选)。

下面显示的这三个命令的输出完全相同。

拆分 只是字符串的许多有用方法之一。 若要查看字符串的所有属性和方法,请通过管道将字符串传递给 Get-Member cmdlet。

参数

-ArgumentList

指定方法调用的参数数组。

此参数是在 Windows PowerShell 3.0 中引入的。

参数属性

类型:

Object[]

默认值:None
支持通配符:False
不显示:False
别名:参数

参数集

PropertyAndMethodSet
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Begin

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

参数属性

类型:ScriptBlock
默认值:None
支持通配符:False
不显示:False

参数集

ScriptBlockSet
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Confirm

在运行 cmdlet 之前,提示你进行确认。

参数属性

类型:SwitchParameter
默认值:False
支持通配符:False
不显示:False
别名:cf

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-End

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

参数属性

类型:ScriptBlock
默认值:None
支持通配符:False
不显示:False

参数集

ScriptBlockSet
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-InputObject

指定输入对象。 ForEach-Object 在每个输入对象上运行脚本块或作语句。 输入包含对象的变量,或键入获取对象的命令或表达式。

InputObject 参数与 命令结果一起使用ForEach-Object时,ForEach-Object 值被视为单个对象,而不是管道命令结果。 即使值是命令的结果(如 -InputObject (Get-Process)),也是如此。 由于 InputObject 无法从数组或对象的集合中返回单个属性,因此,如果使用 ForEach-Object 对那些在定义属性中具有特定值的对象执行操作,则可以在管道中使用 ForEach-Object,如本主题中的示例所示。

参数属性

类型:PSObject
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:True
来自管道的值(按属性名称):False
来自剩余参数的值:False

-MemberName

指定要获取的属性或要调用的方法。

允许通配符,但仅在生成的字符串解析为唯一值时才起作用。 例如,如果运行 Get-Process | ForEach -MemberName *Name,并且有多个成员存在包含字符串名称的名称,例如 ProcessNameName 属性,命令将失败。

此参数是在 Windows PowerShell 3.0 中引入的。

参数属性

类型:String
默认值:None
支持通配符:True
不显示:False

参数集

PropertyAndMethodSet
Position:0
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Process

指定对每个输入对象执行的操作。 输入描述作的脚本块。

参数属性

类型:

ScriptBlock[]

默认值:None
支持通配符:False
不显示:False

参数集

ScriptBlockSet
Position:0
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-RemainingScripts

指定 Process 参数未采用的所有脚本块。

此参数是在 Windows PowerShell 3.0 中引入的。

参数属性

类型:

ScriptBlock[]

默认值:None
支持通配符:False
不显示:False

参数集

ScriptBlockSet
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-WhatIf

显示 cmdlet 运行时会发生什么情况。 命令脚本未运行。

参数属性

类型:SwitchParameter
默认值:False
支持通配符:False
不显示:False
别名:无线

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

CommonParameters

此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters

输入

PSObject

你可以通过管道将任何对象传递给此 cmdlet。

输出

PSObject

此 cmdlet 返回由输入确定的对象。

备注

  • cmdlet 的工作方式与 foreach 语句 非常类似,不同之处在于无法通过管道将输入传递给 Foreach 语句。 有关 Foreach 语句 的详细信息,请参阅 about_Foreach
  • 从 PowerShell 4.0 开始,添加了用于集合的 WhereForEach 方法。
  • 可以在此处阅读有关这些新方法的详细信息,about_arrays