HOWTO · PowerShell

如何使用 PowerShell 检查文件是否包含特定字符串

您可以使用 Windows PowerShell 检查文本文件是否包含特定字符串。

在 Windows PowerShell 中搜索文本文件中的特定字符串是一项常见任务。虽然 Unix 和 Linux 环境中有可靠的 grep 命令,但 PowerShell 提供了一种替代方法,使用 Select-StringGet-ContentGet-ChildItem 命令。

在这篇文章中,我们将探讨如何使用 PowerShell 在文本文件中查找字符串的各种方法。

使用 PowerShell 中的 Select-String 检查文件是否包含特定字符串

假设我们在机器上有一个 Demo.txt 文件,并希望在其中查找字符串 Demonstration

以下是执行此操作的 PowerShell 脚本:

Select-String -Path C:\Users\pc\Demo\Demo.txt -Pattern 'Demonstration'

在这个脚本中,我们使用 Select-String-Path 参数来指定文件位置,使用 -Pattern 参数来指定我们要查找的字符串。

如果我们的文件包含指定的模式('Demonstration'),控制台将输出文件名、行号和包含该字符串的行。

输出:

C:\Users\pc\Demo\Demo.txt:1:This purely for demonstration

上述输出显示了包含我们字符串的 Demo.txt 文件的完整路径、包含我们字符串的行(第 1 行)以及字符串本身(This is purely for demonstration)。

但如果我们只需要知道文件是否包含该字符串呢?在这种情况下,我们可以将脚本修改如下:

$Knw = Select-String -Path C:\Users\pc\Demo\Demo.txt -Pattern "Demonstration"

if ($Knw -ne $null) {
    echo Contains String
}
else {
    echo Does not Contain String
}

在这个脚本中,我们定义了一个名为 $Knw 的变量,它包含了在指定路径的文件中搜索字符串"Demonstration"的结果。然后,我们检查变量 $Knw 是否不等于 $null,这意味着在文件中找到了匹配项。

如果找到了匹配项,打印"Contains String."。如果没有找到匹配项,打印"Does not Contain String."

输出:

Contains String

由于我们的文件确实包含模式"Demonstration",输出打印 Contains String

使用 PowerShell 中的 Get-Content 检查文件是否包含特定字符串

Get-Content 是一个从指定路径读取文件内容并返回字符串对象的命令。要在我们的 Demo.txt 文件中使用 Get-Content,我们将使用如下所示的脚本:

Get-Content -Path C:\Users\pc\Demo\Demo.txt | Select-String -Pattern "Demonstration"

在这个脚本中,我们使用 Get-Content 读取由 -Path 参数指定的 Demo.txt 文件的内容,并将其转发到 Select-String 命令,后者使用 -Pattern 参数来定位 Demonstration 字符串。

输出:

This purely for demonstration

如果我们只想确认字符串的存在,可以使用如下所示的脚本:

If (Get-Content C:\Users\pc\Demo\Demo.txt | % { $_ -match "Demonstration" }) {
    echo Contains String
}
else {
    echo Does not Contains String
}

在这个脚本中,我们使用 Get-Content 读取位于 C:\Users\pc\Demo\Demo.txt 的文件数据,并使用管道(|)逐行处理每一行。在%{} 块内,我们检查每一行是否包含字符串"Demonstration",使用 -match 运算符。

如果文件中的任何一行包含"Demonstration",就打印"Contains String"。如果文件中的任何一行不包含"Demonstration",则打印"Does not Contains String"

输出:

Contains String

由于我们的文件包含指定字符串("Demonstration"),我们得到的输出是 Contains String

检查多个包含特定字符串的文件

如果您有超过五十个文本文件,并希望在所有文件中搜索一个字符串,该怎么办?我们将讨论两种方法来实现。

在 PowerShell 中使用 Get-ChildItemSearch-String

我们可以使用 Get-ChildItemSelect-String 命令。Get-ChildItem 命令将根据我们的搜索条件找到一个或多个文件。

让我们看一个例子。假设我们的 Demo 文件夹有超过五十个文本文件,我们可以使用以下脚本在所有文件中搜索字符串 Demonstration

Get-ChildItem -Path C:\Users\pc\Demo\ -Recurse | Select-String -Pattern 'Demonstration'

在这个脚本中,我们使用 Get-ChildItem 列出指定目录(-Path)及其子目录中的文件(-Recurse)。管道操作符(|)将文件列表传递给 Select-String 命令。

最后,我们使用 Select-String 在每个文件中搜索特定模式'Demonstration'

控制台将输出包含我们字符串的文件名、行号和包含该字符串的行。

输出:

C:\Users\pc\Demo\Demo.txt:1:This purely for demonstration
C:\Users\pc\Demo\Insert.txt:1:We will use this demonstration for a test trial
C:\Users\pc\Demo\myfile.txt:1:This is a demonstration file for Get-ChildItem

在 PowerShell 中使用 Select-String

我们也可以仅使用 Select-String 来检查多个文件中的特定字符串。

Select-String -Path C:\Users\pc\Demo\*.txt -Pattern 'Demonstration'

在这个脚本中,我们在 -Path 参数中使用通配符(*)以搜索 Demo 文件夹中的所有文本文件。Select-String 命令将在所有匹配文件中搜索该字符串。

输出:

C:\Users\pc\Demo\Demo.txt:1:This purely for demonstration
C:\Users\pc\Demo\Insert.txt:1:We will use this demonstration for a test trial
C:\Users\pc\Demo\myfile.txt:1:This is a demonstration file for Get-ChildItem

与上面相同,控制台将输出包含我们字符串的文件名、行号和包含该字符串的行。

结论

Windows PowerShell 提供了一套工具,用于高效地在文本文件中搜索字符串。无论您是喜欢使用 Select-StringGet-Content,还是 Get-ChildItemSelect-String 的组合,您都可以轻松在文件中定位和处理数据。

有了这些命令,您将轻松找到所需的信息,使 PowerShell 中的文本文件搜索变得毫不费力。