如何在PowerShell中使用foreach循环

782 阅读4分钟

在编程中,循环是一个简单而强大的概念。循环是一组指令的重复,除非满足某个条件。一个适当的循环可以节省时间,提高代码的效率。PowerShell,作为一种脚本语言,支持各种形式的循环。

在本指南中,看看如何在PowerShell中使用foreach循环。

PowerShell循环

原则上,所有的循环都是一样的。然而,为了获得更好的编码体验和可读性,各种编程语言以不同的方式实现循环概念。事实上,同一种语言可以支持多种类型的循环,每一种都有其独特的结构。

PowerShell支持几种类型的循环。

  • for:一个标准的循环,用于执行特定次数的某些任务。
  • while:一个标准的循环,用于执行特定次数的任务。它一直执行一组操作,直到条件得到满足。
  • do while:只要条件为真,该循环就一直运行。然而,它总是会执行第一次。
  • Do-until:它的工作原理几乎与do while相似。唯一的区别是,它只在给定的条件不为真时才会执行。
  • foreach-object:这个循环对每个输入对象执行一个操作。

正如文章的标题所暗示的,我们将看一下foreach循环。

PowerShell中的forEach循环

foreach循环结构的代码如下

ForEach(ITEM in COLLECTION)
{
    <code>
}

这里

  • ITEM:它是一个单一的值或对象,随着每次迭代而变化。
  • COLLECTION:它可以是一个数组、值的列表、集合或对象。
  • <code_block>:它是一旦循环条件得到满足就会运行的代码块。它一般使用ITEM。

Foreach是最常见和最简单的PowerShell循环之一。它读取整个项目集合,对于每个项目,它执行定义的操作。

它可以用于许多情况,例如,对一个目录的内容进行操作。

Foreach循环的实践

在本节中,我们将看一下foreach循环的一些示例实现。为了执行这些代码,我已经准备了一个空的PowerShell脚本。

$ nano foreach-loop.ps1

脚本将看起来像这样。

$ #!/snap/bin/powershell

标记PowerShell脚本文件为可执行文件。

$ chmod +x foreach-loop.ps1

通过字符串数组进行foreach
在第一个演示中,我们将实现一个foreach循环,从一个城市名称的字符串数组中读取,并在屏幕上打印出城市名称。

首先,声明这个字符串数组。

$cities = ("Tokyo", "New York", "Moscow", "London", "Sydney")

现在,实现foreach循环,处理数组中的每个元素。

foreach ($city in $cities)
{
    echo $city
}

通过运行脚本来测试该代码。

$ ./foreach-loop.ps1

**遍历一个数字集合
**在这个例子中,我们将实现与前一个类似的foreach循环。不同的是,它将通过一个数字数组来代替。

声明数字数组。

$numbers=(9,8,7,6,5,4,3,2,1)

现在,实现foreach循环,逐一打印数字。

foreach ($number in $numbers)
{
    echo $number
}

让我们把代码付诸行动。

$ ./foreach-loop.ps1

通过文件进行foreach
这是使用foreach循环的最常见的情况之一。在其他cmdlet的帮助下,我们可以获得某些目录/文件的具体信息,并使用这些信息来执行必要的操作。

在这个例子中,foreach循环将检查目录/home/viktor/Desktop/sample_dir的内容并打印文件名。

foreach($file in Get-ChildItem -Recurse -Path /home/viktor/Desktop/sample_dir)
{
    echo $file
}

运行代码。

$ ./foreach-loop.ps1

在这里,cmdletGet-ChildItem在描述的位置上获取项目。标志"-Path "描述了要查找的目录。如果有多层次的子目录,那么使用"-Recurse "将递归地获得所有的子项目。如果你想递归到某一深度,你也可以使用"-深度 "参数.

我们还可以对代码进行微调,只搜索特定的文件扩展名。

foreach($file in Get-ChildItem -Recurse -Path /home/viktor/Desktop/sample_dir/*.txt)
{
    echo $file
}

Foreach over CSV
一个
CSV文件是一个由数值组成的文本数据库,每个数值由分隔符(主要是逗号)分隔。它是一种简单而有效的结构,以文本格式存储结构化数据。CSV格式被各种应用程序和数据库引擎使用,以方便和易于使用。

我们可以使用foreach循环来处理CSV文件的单个值,并采取相应的行动。下面的例子就是这样做的。

$values = (Get-Content /home/viktor/sample.csv)[0].split(",")
foreach ($value in $values){
    echo $value
}

Foreach方法
到现在为止,我们已经看到了foreach循环的作用,对吗?在PowerShell中,它也作为foreach()方法出现。从PowerShell v4开始,这个方法存在于数组或对象的集合中。该方法有一个标准的脚本块作为参数,包含了每次迭代要采取的行动。

让我们来看看foreach()方法的操作。首先,创建一个样本数组。

$numbers=(2,4,8,16,32,64,128,256,512)

现在,我们可以调用该方法,并在每次迭代中描述一个简单的回声命令。

$numbers.ForEach({
    echo $_
})

Foreach-Object
Foreach循环也可以直接处理对象。要做到这一点,有一个专门的cmdlet,名为Foreach-Object。它将一个对象作为输入,并对其元素进行迭代。

在下一个例子中,我们将在一个特定的目录中搜索".txt "文件,并使用Foreach-Object根据搜索结果中的每个元素来采取行动。

$names = Get-ChildItem -Recurse /home/viktor/Desktop/sample_dir/*.txt
$names |
Foreach-Object {
    echo $_
}

正如你所看到的,Foreach-Object的核心结构是非常相似的。唯一不同的是,你可以使用管道来传递对象。

最后的思考

PowerShell中的foreach循环是一个简单但有效且强大的循环。它可以基于对象、数组或单个元素来操作。本指南演示了foreach循环的一些常见实现。