当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell ForEach 循环、ForEach-Object Cmdlet - 初学者指南

作者:精品下载站 日期:2024-12-14 21:26:34 浏览:14 分类:玩电脑

PowerShell ForEach 循环、ForEach-Object Cmdlet - 初学者指南


作为 PowerShell 用户,您可能熟悉 foreach 循环。如果您想掌握脚本编写的艺术并最大限度地提高脚本编写效率,则必须了解此循环的工作原理以及何时在脚本中使用它。 PowerShell 的 ForEach 循环和 ForEach-Object cmdlet 允许您迭代对象集合并对集合中的每个项目执行特定操作。在本文中,我们将了解如何使用这些 cmdlet 来处理对象集合,并在此过程中演示一些实际示例。

PowerShell ForEach 循环

PowerShell 中的 ForEach 循环允许您迭代对象集合,例如数组、文件列表、一组用户帐户或项目列表。 ForEach cmdlet 的语法如下:


ForEach (item in collection) {
    # code to execute on each item
}

以下是如何在 PowerShell 中使用 ForEach 循环来迭代数组元素的示例:


$items = 1,2,3,4,5

ForEach ($item in $items)
{
   Write-Host "Item: $item"
}

此循环迭代数字数组(循环内的代码块 - 大括号之间的语句)在循环的每次迭代中执行)并将每个数字打印到控制台。这将输出以下内容:


Item: 1
Item: 2
Item: 3
Item: 4
Item: 5

您还可以使用 ForEach 循环来迭代对象的属性:


#Object
$Employee = [pscustomobject] @{
    Name = "Shan Mathew"
    Designation = "IT Manager"
    Country = "United States"
}

#Get All Properties of the Object
Foreach ($Property in $Employee.PSObject.Properties)
{
    Write-Host "$($Property.Name): $($Property.Value)"
}

这将输出以下内容:


Name: Shan Mathew
Designation: IT Manager
Country: United States

您还可以使用 ForEach 循环对对象列表中的每个项目(例如文件或文件夹)执行操作。例如:


#Get All Files from a Folder
$Files = Get-ChildItem "C:\Temp" | Where { !$_.PSIsContainer }

#Print Each File Name in the Console
ForEach ($File in $Files) {
    Write-host $File.Name
}

在此示例中,Get-ChildItem cmdlet 用于获取 C:\Temp 目录中所有文件的列表,ForEach 循环遍历文件列表并将每个文件的名称打印到控制台。

[玩转系统] PowerShell ForEach 循环、ForEach-Object Cmdlet - 初学者指南

PowerShell ForEach-Object cmdlet

ForEach-Object cmdlet 是一个允许您对对象集合中的每个对象执行操作的 cmdlet。与 ForEach 语句不同,它使用管道作为其输入。 ForEach-Object cmdlet 的语法如下:


<input> | ForEach-Object {
    # code to execute on each item
}

PowerShell 1..10 ForEach

以下是使用 ForEach-Object 循环 1 到 10 之间的数字的示例:


#Loop between 1 to 10 numbers
1..10 | ForEach-Object {
    Write-host $_
}

这会在屏幕上打印 1 到 10 之间的数字。 ForEach-Object 通常与 Where-Object cmdlet 结合使用,以在执行操作之前过滤集合中的对象。 ForEach-Object 可与任何类型的对象一起使用,包括数组、列表、字符串等。以下是一些示例:

  • 获取目录中所有项目的列表 - Get-ChildItem -Path "C:\Temp" | ForEach-Object { $_.Name }
  • 获取计算机上运行的所有进程的列表 - Get-Process | ForEach-Object { $_.ProcessName }
  • 将列表中的所有字符串转换为大写 - "One", "Two", "Three" | ForEach-Object { $_.ToUpper() }

带有 -Begin 和 -End 参数的 ForEach-Object

-Begin-End 参数允许您分别指定在集合迭代之前和之后执行的脚本块。例如,让我们遍历文件夹中的每个文件:


Get-ChildItem "C:\Temp" | Where { !$_.PSIsContainer } | ForEach-Object {
  Write-Host "Processing file $($_.Name)"
} -Begin {
  Write-Host "Start processing files"
} -End {
  Write-Host "Finished processing files"
}

在此示例中,使用 -Begin 参数指定的脚本块在迭代开始之前执行,使用 -End 参数指定的脚本块在迭代结束后执行。完全的。

您还可以使用 ForEach 循环对对象列表中的每个项目(例如文件或文件夹)执行操作。例如:

ForEach 循环与。 PowerShell 中的 ForEach-Object cmdlet

在 PowerShell 中,ForEach 循环和 ForEach-Object cmdlet 都用于迭代对象集合,但它们的工作方式略有不同。当您将 ForEach 语句放在行的开头时(例如,ForEach ($item in $items) {}),它是一个传统的循环构造,允许您为数组或集合中的每个元素执行代码块。

另一方面,ForEach-Object cmdlet 是一个旨在与 PowerShell 管道配合使用的 cmdlet。它从管道获取输入,对每个对象执行操作,并将结果沿着管道传递。以下是使用 ForEach-Object cmdlet 的示例:(例如,Get-ChildItem | ForEach-Object { Write-Host $_.Name })。 ForEach 关键字也可以通过管道传输,因为它也是 ForEach-Object 的别名。但反过来是不可能的!

PowerShell ForEach 与 ForEach-Object:使用哪一个?

现在我们已经介绍了 foreachforeach-object 之间的异同,您可能想知道在 PowerShell 脚本中使用哪一个。答案取决于您的具体场景和要求。

如果您已经有了一个对象集合并且只需要迭代它们,那么 foreach 可能是最佳选择。如果您正在使用管道输入或需要更灵活地处理输入,foreach-object 可能是更好的选择。

在 PowerShell 中中断 ForEach 循环和 ForEach-Object cmdlet

break 关键字可用于在 PowerShell 中提前退出 ForEachForEach-Object 循环。

如何在 PowerShell 中打破 ForEach 循环?

ForEach 语句允许您迭代项目集合并对每个项目执行操作。但如果您需要尽早跳出循环怎么办?要在 PowerShell 中尽早退出 foreach 循环,可以使用 break 关键字。这是一个例子:


$Array = 1..10
Foreach($Val in $Array){
    #Stop at 5
    if($val -eq 5){
        break
    }
    Write-Host "Value: $val"
}

输出 :


Value: 1
Value: 2
Value: 3
Value: 4

在上面的示例中,foreach 循环将迭代 $array 数组的元素。当循环到达值为5的元素时,会遇到break关键字,导致循环立即退出。

中断 ForEach-Object cmdlet 迭代

要在 PowerShell 中打破 ForEach-Object 循环,可以使用 break 关键字。 break 关键字立即退出循环并在循环后继续执行脚本。以下是在 ForEach-Object 循环中使用 break 的示例:


#Get All running processes
$Processes = Get-Process
$Counter = 1

#Iterate through each process
$Processes | ForEach-Object {
  Write-host "Processing Item $Counter of $($Processes.count)"
  if ($_.Name -eq "notepad") {
    Write-Host "Found Notepad process and exiting from the Loop!"
    break
  }
  $Counter++
}
Write-Host "Finished processing processes"

在此示例中,脚本使用 Get-Process 获取进程列表,并使用 ForEach-Object 迭代每个进程。如果进程的名称是“notepad”,则会显示一条消息,并使用 break 关键字退出循环。然后脚本在循环后继续执行。

[玩转系统] PowerShell ForEach 循环、ForEach-Object Cmdlet - 初学者指南

在 PowerShell ForEach 循环中继续

continue 关键字可跳过循环中的当前元素并继续循环的下一次迭代。例如:


#PowerShell ForEach 1..10
$Array = 1..10
Foreach($Val in $Array){
    #Skip 5
    if($val -eq 5){
        Continue
    }
    Write-Host "Value: $val"
}

输出 :


Value: 1
Value: 2
Value: 3
Value: 4
Value: 6
Value: 7
Value: 8
Value: 9
Value: 10

在上面的示例中,foreach 循环将迭代 $array 数组的元素。当循环到达值为 5 的元素时,将遇到 continue 关键字,导致循环跳过当前迭代的剩余部分并继续进行下一次迭代。

在 ForEach-Object cmdlet 中继续

但是,当您在 ForEach-Object cmdlet 中使用 break 或 continue 时,整个循环将终止,而不是跳过当前迭代。您必须使用“返回”而不是“继续”。


#Loop between 1 to 10 numbers
1..10 | ForEach-Object {
    if ($_ -eq 5) {
    return
  }
    Write-host $_
} 

输出 :


Value: 1
Value: 2
Value: 3
Value: 4
Value: 6
Value: 7
Value: 8
Value: 9
Value: 10

结论

正如您所看到的,ForEach 循环和 ForEach-Object cmdlet 对于处理对象集合非常有用,它们允许您迭代每个对象并对其执行操作。在本文中,我们探讨了 PowerShell foreach 的细节,包括它的工作原理、使用它的最佳实践,以及使用这种强大的结构编写高效脚本的提示和技巧。通过在 PowerShell 脚本中使用它们,您可以高效地对大型对象集合执行复杂的操作。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯