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 别名,并省略 MemberName 和 ArgumentList 参数的名称(可选)。
下面显示的这三个命令的输出完全相同。
拆分 只是字符串的许多有用方法之一。
若要查看字符串的所有属性和方法,请通过管道将字符串传递给 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,并且有多个成员存在包含字符串名称的名称,例如 ProcessName 和 Name 属性,命令将失败。
此参数是在 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 开始,添加了用于集合的
Where和ForEach方法。 - 可以在此处阅读有关这些新方法的详细信息,about_arrays