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

[玩转系统] 如何使用 PowerShell Get-Content 读取文件

作者:精品下载站 日期:2024-12-14 03:44:13 浏览:14 分类:玩电脑

如何使用 PowerShell Get-Content 读取文件


Get-Content cmdlet 可用于从 PowerShell 中的文件检索内容。它将一次一行检索内容,并将它们存储在一个数组中。这允许您使用或处理 PowerShell 脚本中的每一行。

Get-Content 带有多个参数,允许您选择或过滤要从文件中检索的结果。当您需要处理大量大文件时,使用 -raw 参数可以加快处理速度。

在本文中,我们将了解如何使用 Get-Content cmdlet,并解释可以使用的不同参数。

使用 Get-Content 读取文件

我们将从基础知识开始,使用 Get-Content cmdlet 在 PowerShell 中逐行读取文件。对于下面的示例,我将使用一个包含 100 行的文本文件,这些行已编号。这使得遵循示例变得更加容易:

1..100 | ForEach-Object { Add-Content -Path .\LineNumbers.txt -Value "This is line $_." }

上面的代码来自 Microsoft,创建一个文本文件,其中每行以字符串“This is line ”开头,后跟行号:

[玩转系统] 如何使用 PowerShell Get-Content 读取文件

要查看新创建文件的结果,我们可以使用 Get-Content cmdlet。您只需要指定文件的路径即可开始读取其内容:

Get-Content -Path .\LineNumbers.txt

如果我们将 Get-Content 的结果存储在变量中,那么我们可以看到 PowerShell 将结果存储在数组中。这意味着我们可以对结果使用任何 Array 函数,或使用 ForEach 循环处理每一行:

$contents = Get-Content -Path .\LineNumbers.txt
$contents.GetType()

# Result 
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

# Return the 6th line (the index of an array start at 0 ? )
$contents[5]

# Result
This is line 6

[玩转系统] 如何使用 PowerShell Get-Content 读取文件

返回第一行或最后 x 行

默认情况下,Get-Content cmdlet 将返回 PowerShell 中文件的所有内容。但在某些情况下,您只想查看文件中的前 x 行或最后 x 行。例如,在调试问题时,您通常只需要日志文件中的最后几行。

为此,我们有两个选择,我们可以使用参数 -TotalCount,它返回内容的前 x 项。或者我们可以使用参数-Tail,它返回文件的最后x个项目。

让我们回到日志文件示例。我们想要查看日志中的最后 10 行。为此,我们需要指定路径并添加 -Tail 10 以仅返回最后 10 行:

Get-Content C:\temp\files\la-srv-dc01.log -Tail 10

[玩转系统] 如何使用 PowerShell Get-Content 读取文件

要从文件中读取第一个 x 项,我们需要使用参数 -TotalCount

Get-Content -Path .\LineNumbers.txt -TotalCount 5

从文件中返回一行

如果您知道需要从文本文件中选择哪一行,则可以仅从文本文件中选择一行。众所周知,结果存储在数组中。所以我们可以使用数组索引来选择我们需要的行号。

请记住,数组索引从 0 开始,因此如果我们想要返回第 16 行,则需要指定索引号 15。我们将 Get-Content 命令括在括号中 ( ) 以便 PowerShell 在继续之前先完成 Get-Content 命令。

(Get-Content -Path .\LineNumbers.txt)[15]

# Result
This is line 16.

如果您有一个很大的文本文件,那么您可能不想完全读取它而只返回一行。您可以做的是仅选择文件中的前 x 行或最后 x 行,然后使用数组索引选择行号。

例如,假设我们需要文件中的第五行。我们将 TotalCount 设置为 5,仅读取前 5 行,并返回数组中的最后一项:

(Get-Content -Path .\LineNumbers.txt -TotalCount 5)[-1]

# Result
This is line 5.

使用 Get-Content 读取多个文件

还可以使用 PowerShell 中的 Get-Content 一次读取多个文件的内容。为此,您只需指定文件所在的路径,后跟星号*

Get-Content -Path c:\temp\files\*

但请记住,结果中不会有任何对源文件的引用。所以你不知道 x 来自哪个文件行。

我们还可以过滤我们想要读取的文件。例如,如果您只想获取所有 .log 文件的内容,那么您可以向其添加参数 -Filter

Get-Content -Path c:\temp\files\* -Filter '*.log'

使用-Raw

Get-Content cmdlet 将文件的每一行读取到数组中,当您需要独立处理每一行或正在查找单行时,这非常有用。但是,如果您需要搜索并替换文件的内容,则数组会很糟糕。

例如,当您有一个 HTML 文件用作要使用 PowerShell 发送的电子邮件的模板时。在 HTML 文件中,我们需要替换占位符,如下所示:

<p>Hi {{manager.firstname}},</p>
<p>
 The account for {{user.fullname}} is ready. Below you will find the login details for {{user.firstname}}. We have set a temporary password which must be
 changed after the first login.
</p>
<p>
 In the attachment you will find a starting guide for new users
</p>

我们可以使用 -Raw 参数将整个文件作为单个字符串读取,并使用 -Replace 运算符来替换占位符,而不是循环遍历每一行来查找占位符并替换它们:

(Get-Content -Path c:\temp\template.html -Raw) -replace '{{user.fullname}}', $user.fullName -replace '{{user.firstname}}', $user.givenName

使用 -Raw 参数的另一个优点是速度更快。 Get-Content 对于小型文本文件效果很好,但是当您需要处理大型文本文件时,您可能会注意到该命令有点缓慢。

例如,读取一个 50Mb 的文本文件大约需要 5 秒,如下面的屏幕截图所示:

[玩转系统] 如何使用 PowerShell Get-Content 读取文件

但是当使用 -Raw 时,花费了不到半秒的时间:

[玩转系统] 如何使用 PowerShell Get-Content 读取文件

如果您仍然需要数组中的结果,那么我们可以使用 -Raw 结合 -split 字符串运算符来创建文件每一行的数组。此方法仍然比使用不带 -Raw 的 Get-Content 快 5 倍。

$log = (Get-Content .\largefile.log -Raw) -split "`r`n"

使用 ReadAllLines 更快地读取文件

当处理非常大的文件(100Mb 甚至更大)时,还有一种更快的方法来使用 PowerShell 读取文件的内容。 .Net 方法 System.IO.File.ReadAllLines()。与使用 -Raw 方法相比,将所有行读入内存只需一半的时间。

结果与 Get-Content 一样,存储在数组中。因此您可以以相同的方式处理该数据。

$log = [System.IO.File]::ReadAllLines('c:\temp\files\largefile.log')

您还可以使用方法[System.IO.File]::ReadLines,该方法更快。但这会立即将内容传输到控制台,而不是将其存储在内存中。这种方法的问题是,您需要在完成后关闭文件,否则,它将被流锁定。

使用 -Wait 观看文件

Get-Contents 最后一个有趣的功能是我们可以使用 -Wait 参数监视或查看文件的内容。例如,如果您想要监视日志文件。然后,您可以添加 -wait 参数,而不是每次都重新运行 Get-Content cmdlet。

一旦文件的内容被更新(并保存),它将更新 Get-Content 的输出。

Get-Content -Path c:\temp\testfiles\LineNumbers.txt -Tail 5 -Wait

# Result
This is line 96.
This is line 97.
This is line 98.
This is line 99.
This is line 100.

如果我们在文件末尾添加新行,那么这些行将显示在结果中。

总结

当您需要快速读取文件时,PowerShell 中的 Get-Content cmdlet 非常有用。但是,在处理大文件时,您确实需要使用 -Raw 参数,至少可以加快该过程。另外,尝试一下 .Net 方法,您会惊讶于它的速度有多快。

我希望这篇文章对您有用,如果您有任何疑问,请在下面发表评论。

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

取消回复欢迎 发表评论:

关灯