HOWTO · PowerShell
在 PowerShell 中嵌套 ForEach-Object 和 Where-Object
本教程将讨论 PowerShell 中的 Where-Object 和 ForEach-Object。
本页内容
PowerShell 的 Where-Object 和 ForEach-Object cmdlet 是系统化和高效数据过滤和处理的不可或缺的工具。通过利用这些 cmdlet 的强大功能,PowerShell 用户可以精确而轻松地操作数据集,根据特定条件执行操作,并轻松迭代集合。
本文阐明了 Where-Object 和 ForEach-Object 的用法,演示它们如何单独和结合使用以完成各种任务。从过滤 Windows 服务到对数值数据进行计算,甚至实施嵌套操作以应对更复杂的场景,这些 cmdlet 为 PowerShell 脚本中的数据操作提供了强大的框架。
在 PowerShell 中使用 Where-Object Cmdlet
Where-Object 是一个内置的 cmdlet,用于过滤输出命令并显示您想要看到的信息。通常,Where-Object 的运行方式就像一个过滤器。
它还允许您创建可以返回真或假的条件。
在下面的示例中,我们将查找在我们的计算机上以 自动 模式运行的所有服务。为此目的的命令是类似于以下内容:
Get-Service | Where-Object -FilterScript { $_.StartType -EQ 'Automatic' }
在这个代码片段中,我们首先使用 Get-Service cmdlet 检索一组 Windows 服务。然后将此集合通过管道传输到 Where-Object cmdlet,在这里对管道中的每个服务对象应用过滤脚本。
在过滤脚本中,我们评估每个服务对象的 StartType 属性,以确定它是否等于字符串 "Automatic"。如果服务的 StartType 属性符合此标准,则它将通过管道传递。
这个过滤脚本有效地选择了那些启动类型设置为 "Automatic" 的服务。这个过滤操作的结果是原始服务集合的一个子集,只包含配置为自动启动的服务。
在运行上述命令行后,您将得到如下所示的输出:
在 PowerShell 中使用 ForEach-Object Cmdlet
ForEach-Object 允许您对每个指定的对象执行特定任务。在我们下面的示例中,我们将每个对象除以 1024。
我们示例的代码将类似于以下内容:
3000, 567980, 112432 | ForEach-Object -Process { $_ / 1024 }
在这个代码片段中,我们使用 ForEach-Object cmdlet 遍历三个数字的集合:3000、567980 和 112432。在脚本块中,我们通过将每个数字除以 1024 来执行计算。
这个计算对集合中的每个数字单独执行。因此,我们获得了一个新的集合,其中包含除法运算的结果,原始集合中的每个数字都被除以 1024。
在运行上述命令行后,您将得到如下所示的输出:
在 PowerShell 中使用嵌套的 ForEach-Object 和 Where-Object
ForEach-Object 和 Where-Object cmdlet 的组合允许强大的数据操作和过滤操作。嵌套方法,即在一个 cmdlet 的作用域内使用另一个 cmdlet,增强了迭代和选择性处理数据的能力。
这种方法在处理数组或对象集合时特别有用,并需要根据特定标准执行操作。
示例:
$MyArray = ("python", "explorer", "edge")
$MyArray | ForEach-Object { Get-Process | Where-Object ProcessName -EQ $_ | Out-Host }
在这个代码片段中,$MyArray 包含一个进程名称的列表。ForEach-Object cmdlet 遍历数组中的每个进程名称。
在脚本块中,Get-Process 检索所有正在运行的进程的信息,Where-Object 根据它们的 ProcessName 属性与当前进程名称 ($_) 匹配的条件过滤这些进程。过滤后的进程对象然后通过 Out-Host 输出到控制台。
输出:
在 PowerShell 中使用嵌套的 ForEach-Object 和 Where-Object 与 if 语句
在 PowerShell 脚本中,嵌套的 if 语句提供了一种在循环和其他控制结构中应用条件逻辑的方法。当与 ForEach-Object 和 Where-Object cmdlet 结合使用时,嵌套的 if 语句使得复杂的数据过滤和处理操作成为可能。
这种方法在根据多个标准处理数据时提供了灵活性和细粒度控制。它在需要对数据操作进行细致控制的场景中特别有用。
示例:
$MyArray = @("Value1", "Value2", "Value3")
$MyArray | ForEach-Object {
if ($_ | Where-Object { $_ -eq "Value1" -or $_ -eq "Value3" }) {
$_ | Out-Host
}
}
在这个代码片段中,$MyArray 包含一个值的列表。ForEach-Object cmdlet 遍历数组中的每个值。
在嵌套的 if 语句中,Where-Object 根据值等于 "Value1" 或 "Value3" 的条件过滤值。
如果条件满足,该值将使用 Out-Host 输出到控制台。
输出:
结论
通过其多功能的 cmdlet,如 Where-Object 和 ForEach-Object,PowerShell 赋予用户以精细的方式处理复杂数据的能力。无论是从集合中选择特定元素,应用条件逻辑,还是对每个项进行迭代执行任务,PowerShell 提供了必要的工具来简化工作流程并提高生产力。
通过掌握这些 cmdlet 并理解其细微差别,用户可以充分利用 PowerShell 高效进行数据操作和脚本任务,在自动化和管理中开启无限可能的世界。