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

[玩转系统] PowerShell - 逐行读取文件 [4 种方式]

作者:精品下载站 日期:2024-12-14 05:24:58 浏览:15 分类:玩电脑

PowerShell - 逐行读取文件 [4 种方式]


[玩转系统] PowerShell - 逐行读取文件 [4 种方式]

使用 Get-Content Cmdlet

使用 Get-Content cmdlet 在 PowerShell 中逐行读取文件。

使用获取内容 Cmdlet:

Get-Content E:\Test\File1.txt

输出 :

This is line one.
This is line two
This is line 3.
I am line 4.
Its line 5.
This is line 6.
This is line 7.

我们使用 Get-Content cmdlet 在 PowerShell 中逐行读取指定文件。用于获取指定项的内容或数据;这里,指定的项目可以是文本文件或函数。

对于文件,Get-Content cmdlet 将一次读取一行并返回对象集合,其中每个对象都代表该行内容。

如果您使用的是 PowerShell 3.0 或更高版本,您还可以从文件的开头或结尾获取特定的行号。我们还可以使用 Get-ContentForEach() 获得与上面相同的结果。

将 Get-Content Cmdlet 与 ForEach 结合使用:

ForEach ($line in Get-Content E:\Test\File1.txt) {echo $line}

输出 :

This is line one.
This is line two
This is line 3.
I am line 4.
Its line 5.
This is line 6.
This is line 7.

在上面的代码中,我们使用 Get-Content 获取指定文件的所有内容,然后使用 ForEach() 循环迭代检索到的内容的每一行。 对于每次迭代,我们使用 echo 来打印每一行。

通常,当我们需要操作每一行时,首选这种方法(使用 Get-ContentForEach())。例如,如果我们想在开头添加 OK -,我们将在 echo 语句中使用串联运算符 (+),如下所示每一行然后显示它。

将 Get-Content Cmdlet 与 ForEach 结合使用:

ForEach ($line in Get-Content E:\Test\File1.txt) {echo ("OK - " + $line)}

输出 :

OK - This is line one.
OK - This is line two
OK - This is line 3.
OK - I am line 4.
OK - Its line 5.
OK - This is line 6.
OK - This is line 7.

现在,考虑一种情况,我们需要逐行读取指定的文件,但对于给定文本文件的开头/结尾处的特定行数,以下解决方案将适合我们。

使用 Get-Content Cmdlet 读取部分数据

在PowerShell中逐行读取指定的文本文件:

  • 使用Get-Content逐行读取指定文件。
  • 使用 Select-Object-First/-Last 参数名称来读取第一个/最后一个 n 个数线。

使用带有 -First/-Last 参数的 Get-Content Cmdlet:

$file_content = Get-Content E:\Test\File1.txt
$first_four_lines = $file_content | Select-Object -First 4
$last_four_lines = $file_content | Select-Object -Last 4

Write-Host @"
First Four lines:
$($first_four_lines)

Last Four lines:
$($last_four_lines)
"@

输出 :

First Four lines:
This is line one. This is line two This is line 3. I am line 4.
Last Four lines:
I am line 4. Its line 5. This is line 6. This is line 7.

在上一节中,我们了解了 Get-Content cmdlet。在这里,我们再次使用它从指定文件中读取内容,但这一次,我们将读取的数据保存在 $file_content 变量中。

接下来,我们使用管道 (|) 将 $first_content 变量的值转发到 Select-Object cmdlet,该管道用于转发数据从上一个流程转到下一个流程。

Select-Object cmdlet 用于选择对象/对象属性。我们还可以使用它从数组中的特定位置选择特定数量的唯一对象和对象。

此 cmdlet 允许我们使用各种参数,例如 -First-Last,从数组中选择特定数量的对象。

在我们的例子中,每一行都是一个对象,-First 选择前四行并将它们作为数组返回。 -Last 执行相同的操作,但从最后一个对象中选择对象。

如果我们正在寻找一种逐行读取整个文件但显示与特定模式匹配的文件的方法,那么以下解决方案适合我们。下面我们就来学习一下这个方法。

Get-Content Cmdlet 与 -Like 运算符结合使用

要在 PowerShell 中逐行读取给定文件:

  • 定义模式后,使用 ForEach() 迭代我们使用 Get-Content cmdlet 读取的文件的每一行。
  • 在每次迭代中,使用 if 语句和 -Like 运算符在当前行中搜索指定模式。
  • if 块中,如果满足 if 条件,则使用 Write-Output cmdlet 打印当前行。

将 Get-Content 与 -Like 运算符表达式结合使用:

foreach($current_line in Get-Content E:\Test\File1.txt)
{
    if($current_line -like "*[0-9].")
    {
        Write-Output $current_line
    }
}

输出 :

This is line 3.
I am line 4.
Its line 5.
This is line 6.
This is line 7.

此代码示例与第一部分类似,其中我们将 Get-ContentForEach() 循环结合使用。唯一的区别是使用 if 语句和 -Like 运算符来搜索给定模式,并在满足条件时显示 $current_line if 条件。

使用 -Like 运算符的优点是我们不需要转义反斜杠。现在,我们使用什么模式?我们仅在 PowerShell 控制台上打印那些以任何数字结尾并紧跟一个点 (.) 的行。

使用 switch 语句

使用switch在PowerShell中逐行读取给定的文本文件。

使用 switch 语句:

$regex = '^I'

switch -regex -file E:\Test\File1.txt { 
    $regex { 
        "line is: $_"
    } 
}

输出 :

line is: I am line 4.
line is: Its line 5.

我们使用带有 -Regex-File 参数的开关,其中 -File 用于指定读取内容的文件名, -Regex 用于执行值与条件的正则表达式匹配。

在上面的代码示例中,我们将自定义正则表达式值编写为 I,确保匹配行以 I 开头。如果指定的正则表达式条件评估为 True,它将打印上面给出的输出中所示的行。

如果您想了解 $_,请不要担心;它是 PowerShell 中的一个自动变量,用于保存满足正则表达式条件的行。

使用 [System.IO.File] 类的 ReadLines()

使用[System.IO.File]类的ReadLines()方法在PowerShell中逐行读取指定文件。

使用 System.IO.File 类的 ReadLines():

foreach($line in [System.IO.File]::ReadLines("E:\Test\File1.txt")){
   Write-Output $line
}

输出 :

This is line one.
This is line two
This is line 3.
I am line 4.
Its line 5.
This is line 6.
This is line 7.

使用 [System.IO.File] 类的 ReadLines() 方法是 Get-Content cmdlet 的绝佳替代方案来读取文本文件(位于给定路径中)逐行。

到目前为止,我们已经介绍了逐行读取文件的各种方法,但是如果有空行怎么办?让我们看看以下方法来学习如何处理空行。

使用 StreamReader 类

要在 PowerShell 中逐行读取文件:

  • 使用 New-Object cmdlet 创建一个 StreamReader 对象。
  • 使用 while 循环一次读取一行并检查它是否不为空。
  • 如果当前行不为空,请使用 Write-Host cmdlet 打印行号以及该行的文本。

使用 StreamReader 类:

$stream_reader = New-Object System.IO.StreamReader{E:\Test\File1.txt}
$line_number = 1
while (($current_line =$stream_reader.ReadLine()) -ne ''){
    Write-Host "$line_number  $current_line"
    $line_number++
}

输出 :

1  This is line one.
2  This is line two
3  This is line 3.
4  I am line 4.
5  Its line 5.

在这里,我们使用 New-Object cmdlet 创建了一个 StreamReader 对象,并将其保存在 $stream_reader 变量中。接下来,我们声明一个 $line_number 并使用 1 对其进行初始化;我们将使用这个变量在读取时维护行号。

接下来,我们使用$stream_reader对象的.ReadLine()方法逐行读取指定文件;在每次迭代中,$current_line 变量将使用 .ReadLine() 方法返回的文本进行更新。如果 $current_line 不等于空行,我们只能在 while 内移动。

如果不是空行,则将 $line_number$current_line 一起打印,并将 $line_number 增加 1 >;否则,退出 while 循环。请记住,一旦找到空行,该循环就会存在。如果要读取所有文件(不包括空行),则必须根据需要更新代码。

如果不这样做,您也可以从文件中删除空行,并通过上述方法逐行读取文件。

这就是如何在 PowerShell 中逐行读取文件的全部内容。

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

取消回复欢迎 发表评论:

关灯