cmdlet Select-String 使用正则表达式匹配在输入字符串和文件中搜索文本模式。 可以在 UNIX 或 findstr.exe Windows 中使用 Select-String 类似的 grep

Select-String 基于文本行。 默认情况下, Select-String 查找每行中的第一个匹配项,并且对于每个匹配项,它显示文件名、行号以及包含匹配项的行中的所有文本。 你可以直接 Select-String 为每行查找多个匹配项,在匹配之前和之后显示文本,或者 (指示是否找到匹配项的 True 或 False) 显示布尔值。

Select-String 可以显示所有文本匹配项,也可以在每个输入文件中的第一个匹配后停止。 Select-String 可用于显示与指定模式不匹配的所有文本。

还可以指定 Select-String 应使用特定字符编码,例如在搜索 Unicode 文本文件时。 Select-String 使用 BOM) (字节顺序标记来检测文件的编码格式。 如果文件没有 BOM,则假定编码为 UTF8。

示例 1:查找区分大小写的匹配项

此示例对通过管道发送到 cmdlet 的文本执行区分大小写的 Select-String 匹配。

'Hello', 'HELLO' | Select-String -Pattern 'HELLO' -CaseSensitive -SimpleMatch

文本字符串 Hello HELLO 在管道中向下发送到 Select-String cmdlet。 Select-String 使用 Pattern 参数指定 HELLO CaseSensitive 参数指定大小写必须仅匹配大写模式。 SimpleMatch 是一个可选参数,指定模式中的字符串不解释为正则表达式。 Select-String 在 PowerShell 控制台中显示 HELLO

示例 2:在文本文件中查找匹配项

此命令在当前目录中搜索文件扩展名为 .txt 的所有文件。 输出显示那些包含指定字符串的文件中的行。

Get-Alias | Out-File -FilePath .\Alias.txt
Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\*.txt -Pattern 'Get-'
Alias.txt:8:Alias            cat -> Get-Content
Alias.txt:28:Alias           dir -> Get-ChildItem
Alias.txt:43:Alias           gal -> Get-Alias
Command.txt:966:Cmdlet       Get-Acl
Command.txt:967:Cmdlet       Get-Alias

在此示例中, Get-Alias Get-Command 与 cmdlet 一起使用 Out-File ,在当前目录中创建两个文本文件, Alias.txt Command.txt

Select-String 使用带星号的 Path 参数 ( * 通配符) 搜索当前目录中文件扩展名 .txt 为 的所有文件。 Pattern 参数指定要与 Get- 匹配的文本。 Select-String 在 PowerShell 控制台中显示输出。 文件名和行号位于包含 Pattern 参数匹配项的每个内容行之前。

示例 3:查找模式匹配项

在此示例中,搜索多个文件以查找指定模式的匹配项。 模式使用正则表达式限定符。 有关详细信息,请参阅 about_Regular_Expressions

Select-String -Path "$PSHOME\en-US\*.txt" -Pattern '\?'
C:\Program Files\PowerShell\6\en-US\default.help.txt:27:    beginning at https://go.microsoft.com/fwlink/?LinkID=108518.
C:\Program Files\PowerShell\6\en-US\default.help.txt:50:    or go to: https://go.microsoft.com/fwlink/?LinkID=210614

Select-String cmdlet 使用两个参数 :Path Pattern Path 参数使用指定 PowerShell 目录的变量 $PSHOME 。 路径的其余部分包括子目录 en-US ,并指定目录中的每个 *.txt 文件。 Pattern 参数指定在每个文件中匹配问号 ( ? ) 。 反斜杠 ( \ ) 用作转义符,并且是必需的,因为) ( ? 问号是正则表达式限定符。 Select-String 在 PowerShell 控制台中显示输出。 文件名和行号位于包含 Pattern 参数匹配项的每个内容行之前。

示例 4:在函数中使用Select-String

此示例创建一个函数,用于在 PowerShell 帮助文件中搜索模式。 对于此示例,函数仅存在于 PowerShell 会话中。 关闭 PowerShell 会话时,将删除该函数。 有关详细信息,请参阅 about_Functions

function Search-Help
    $PSHelp = "$PSHOME\en-US\*.txt"
    Select-String -Path $PSHelp -Pattern 'About_'
Search-Help
C:\Program Files\PowerShell\7\en-US\default.help.txt:67:    The titles of conceptual topics begin with "About_".
C:\Program Files\PowerShell\7\en-US\default.help.txt:70:    Get-Help About_<topic-name>
C:\Program Files\PowerShell\7\en-US\default.help.txt:93:    Get-Help About_Modules : Displays help about PowerShell modules.
C:\Program Files\PowerShell\7\en-US\default.help.txt:97:    about_Updatable_Help

函数在 PowerShell 命令行上创建。 命令 Function 使用名称 Search-Help 。 按 Enter 开始向函数添加 语句。 在提示符下 >> ,添加每个语句并按 Enter, 如示例中所示。 添加右括号后,将返回到 PowerShell 提示符。

函数包含两个命令。 变量 $PSHelp 存储 PowerShell 帮助文件的路径。 $PSHOME 是 PowerShell 安装目录,其子目录 en-US 指定目录中的每个 *.txt 文件。

函数 Select-String 中的 命令使用 Path Pattern 参数。 Path 参数使用 $PSHelp 变量获取路径。 Pattern 参数使用 字符串About_ 作为搜索条件。

若要运行函数,请键入 Search-Help 。 函数的 Select-String 命令在 PowerShell 控制台中显示输出。

示例 5:在 Windows 事件日志中搜索字符串

此示例在 Windows 事件日志中搜索字符串。 变量 $_ 表示管道中的当前对象。 有关详细信息,请参阅 about_Automatic_Variables

$Events = Get-WinEvent -LogName Application -MaxEvents 50
$Events | Select-String -InputObject {$_.message} -Pattern 'Failed'

cmdlet Get-WinEvent 使用 LogName 参数指定应用程序日志。 MaxEvents 参数从日志中获取 50 个最新事件。 日志内容存储在名为 的 $Events 变量中。

变量 $Events 在管道中向下发送到 Select-String cmdlet。 Select-String 使用 InputObject 参数。 变量 $_ 表示当前对象,是 message 事件的一个属性。 Pattern 参数将字符串指定为 Failed ,并在 中 $_.message 搜索匹配项。 Select-String 在 PowerShell 控制台中显示输出。

示例 6:在子目录中查找字符串

此示例在目录及其所有子目录中搜索特定文本字符串。

Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive

Get-ChildItem 使用 Path 参数指定 C:\Windows\System32*.txt Recurse 参数包括 子目录。 对象在管道中向下发送到 Select-String

Select-String 使用 Pattern 参数并指定字符串 Microsoft CaseSensitive 参数用于匹配字符串的确切大小写。 Select-String 在 PowerShell 控制台中显示输出。

根据你的权限,你可能会在输出中看到 “拒绝访问” 消息。

示例 7:查找与模式不匹配的字符串

此示例演示如何排除与模式不匹配的数据行。

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get', 'Set'  -NotMatch

cmdlet Get-Command 将对象通过管道向下发送到 , Out-File 以在当前目录中创建 Command.txt 文件。 Select-String 使用 Path 参数指定 Command.txt 文件。 Pattern 参数将 Get Set 指定为搜索模式。 NotMatch 参数从结果中排除 Get Set Select-String 在 PowerShell 控制台中显示不包含 Get Set 的输出。

示例 8:查找匹配项前后的行

此示例演示如何获取匹配模式前后的线条。

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get-Computer' -Context 2, 3
Command.txt:986:Cmdlet          Get-CmsMessage           6.1.0.0    Microsoft.PowerShell.Security
  Command.txt:987:Cmdlet          Get-Command              6.1.2.0    Microsoft.PowerShell.Core
> Command.txt:988:Cmdlet          Get-ComputerInfo         6.1.0.0    Microsoft.PowerShell.Management
  Command.txt:990:Cmdlet          Get-Content              6.1.0.0    Microsoft.PowerShell.Management
  Command.txt:991:Cmdlet          Get-ControlPanelItem     3.1.0.0    Microsoft.PowerShell.Management
  Command.txt:992:Cmdlet          Get-Credential           6.1.0.0    Microsoft.PowerShell.Security

cmdlet Get-Command 将对象通过管道向下发送到 , Out-File 以在当前目录中创建 Command.txt 文件。 Select-String 使用 Path 参数指定 Command.txt 文件。 Pattern 参数将 Get-Computer 指定为搜索模式。 Context 参数使用两个值(之前和之后),并使用尖括号标记输出中的模式匹配项 ( > ) 。 Context 参数输出第一个模式匹配之前的两行和最后一个模式匹配后的三行。

示例 9:查找所有模式匹配项

此示例演示 AllMatches 参数如何查找文本行中的每个模式匹配项。 默认情况下, Select-String 仅在文本行中查找模式的第一个匹配项。 此示例使用通过 cmdlet 找到 Get-Member 的对象属性。

$A = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell'
C:\Program Files\PowerShell\7\en-US\default.help.txt:3:    PowerShell Help System
C:\Program Files\PowerShell\7\en-US\default.help.txt:6:    Displays help about PowerShell cmdlets and concepts.
C:\Program Files\PowerShell\7\en-US\default.help.txt:9:    PowerShell Help describes PowerShell cmdlets
$A.Matches
Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 4
Length   : 10
Value    : PowerShell
$A.Matches.Length
$B = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell' -AllMatches
$B.Matches.Length
	

cmdlet Get-ChildItem 使用 Path 参数。 Path 参数使用指定 PowerShell 目录的变量$PSHOME。 路径的其余部分包括子目录 en-US ,并指定目录中的每个 *.txt 文件。 对象 Get-ChildItem 存储在 变量中 $A 。 变量 $A 在管道中向下发送到 Select-String cmdlet。 Select-String 使用 Pattern 参数在每个文件中搜索字符串 PowerShell

在 PowerShell 命令行中 $A ,将显示变量内容。 有一行包含字符串 PowerShell 的两个匹配项。

属性 $A.Matches 列出了每行上第一个出现的模式 PowerShell

属性 $A.Matches.Length 对每行上第一次出现的模式 PowerShell 进行计数。

变量 $B 使用相同的 Get-ChildItemSelect-String cmdlet,但添加了 AllMatches 参数。 AllMatches 在每一行上查找 模式 PowerShell 的每个匹配项。 和 $B 变量中$A存储的对象是相同的。

属性 $B.Matches.Length 增加是因为对于每一行,将计算 模式 PowerShell 的每次出现次数。

示例 10 - 使用“Out-String”将管道对象转换为字符串

ToString()通过管道传递的对象的结果与 PowerShell 的格式设置系统生成的富字符串表示形式不同。 因此,可能需要先通过管道将对象传递给 Out-String

管道 将 Out-String 格式化的输出转换为单个多行字符串对象。 这意味着,当找到匹配项时 Select-String ,它会输出整个多行字符串。

PS> $hash = @{
    Name = 'foo'
    Category = 'bar'
# !! NO output, due to .ToString() conversion
$hash | Select-String -Pattern 'foo'
# Out-String converts the output to a single multi-line string object
PS> $hash | Out-String | Select-String -Pattern 'foo'
Name                           Value
----                           -----
Name                           foo
Category                       bar
# Out-String -Stream converts the output to a multiple single-line string objects
PS> $hash | Out-String -Stream | Select-String -Pattern 'foo'
Name                           foo

通过 Out-String -Stream 管道将格式化的输出转换为多个单行字符串对象。 这意味着,当找到匹配项时 Select-String ,它仅输出匹配的行。

-AllMatches

指示 cmdlet 在每行文本中搜索多个匹配项。 如果没有此参数, Select-String 则仅查找每行文本中的第一个匹配项。

在一行文本中找到多个匹配项时 Select-String ,它仍然只为该行发出一个 MatchInfo 对象,但对象的 Matchs 属性包含所有匹配项。

SimpleMatch 参数结合使用时,将忽略此参数。 如果要返回所有匹配项,并且要搜索的模式包含正则表达式字符,则必须转义这些字符,而不是使用 SimpleMatch。 有关转义正则表达式的详细信息,请参阅 about_Regular_Expressions

捕获与模式匹配的行前后指定的行数。

如果你输入一个数字作为此参数的值,则该数字将确定捕获的匹配项前后的行数。 如果你输入两个数字作为此参数的值,则第一个数字将确定该匹配项前面的行数,第二个数字将确定该匹配项后面的行数。 例如,-Context 2,3

在默认显示中,带有匹配项的行由右尖括号 (>) (显示的第一列中的 ASCII 62) 指示。 无标记行是上下文。

Context 参数不会更改 生成的Select-String对象数。 Select-String 为每个匹配生成一个 MatchInfo 对象。 上下文作为字符串数组存储在 对象的 Context 属性中。

当命令 Select-String 的输出沿管道发送到另一个 Select-String 命令时,接收命令仅搜索匹配行中的文本。 匹配的行是 MatchInfo 对象的 Line 属性的值,而不是上下文行中的文本。 因此, Context 参数在接收 Select-String 命令上无效。

当上下文包含匹配项时,每个匹配项的 MatchInfo 对象包括所有上下文行,但重叠的行在显示中只出现一次。

Type:Int32[] Position:Named Default value:None Accept pipeline input:False Accept wildcard characters:False

-Culture

指定与指定模式匹配的区域性名称。 Culture 参数必须与 SimpleMatch 参数一起使用。 默认行为使用当前 PowerShell 运行空间 (会话) 的区域性。

若要获取所有受支持的区域性的列表,请使用 Get-Culture -ListAvailable 命令。

此外,此参数接受以下参数:

  • CurrentCulture,默认值为 ;
  • 序号,即非语言二进制比较;
  • 固定,即与区域性无关的比较。
  • 使用 Select-String -Culture Ordinal -CaseSensitive -SimpleMatch 命令可以获得最快的二进制比较。

    Culture 参数使用 Tab 自动补全功能滚动浏览指定可用区域性的参数列表。 若要列出所有可用参数,请使用以下命令:

    (Get-Command Select-String).Parameters.Culture.Attributes.ValidValues

    有关 .NET CultureInfo.Name 属性的详细信息,请参阅 CultureInfo.Name

    Culture 参数是在 PowerShell 7 中引入的。

    Type:String Position:Named Default value:Culture of the current PowerShell session Accept pipeline input:False Accept wildcard characters:False

    -Encoding

    指定目标文件的编码类型。 默认值为 utf8NoBOM

    此参数的可接受值如下所示:

  • ascii:使用 ASCII (7 位) 字符集的编码。
  • bigendianunicode:使用 big-endian 字节顺序以 UTF-16 格式进行编码。
  • bigendianutf32:使用 big-endian 字节顺序以 UTF-32 格式进行编码。
  • oem:对 MS-DOS 和控制台程序使用默认编码。
  • unicode:使用 little-endian 字节顺序以 UTF-16 格式进行编码。
  • utf7:以 UTF-7 格式编码。
  • utf8:以 UTF-8 格式编码。
  • utf8BOM:使用字节顺序标记 (BOM) 以 UTF-8 格式进行编码
  • utf8NoBOM:不带字节顺序标记的 UTF-8 格式编码 (BOM)
  • utf32:以 UTF-32 格式编码。
  • 从 PowerShell 6.2 开始, Encoding 参数还允许注册代码页的数字 ID () -Encoding 1251 或已注册代码页的字符串名称 () -Encoding "windows-1251" 。 有关详细信息,请参阅 Encoding.CodePage 的 .NET 文档。

    不再建议使用 UTF-7* 。 从 PowerShell 7.1 起,如果为 Encoding 参数指定 utf7 ,则会写入警告。

    Type:Encoding Accepted values:ASCII, BigEndianUnicode, BigEndianUTF32, OEM, Unicode, UTF7, UTF8, UTF8BOM, UTF8NoBOM, UTF32 Position:Named Default value:UTF8NoBOM Accept pipeline input:False Accept wildcard characters:False

    -Exclude

    排除指定项。 此参数值使 Path 参数有效。 请输入路径元素或模式,例如 *.txt。 允许使用通配符。

    Type:String[] Position:Named Default value:None Accept pipeline input:False Accept wildcard characters:True

    -Include

    包括指定项。 此参数值使 Path 参数有效。 请输入路径元素或模式,例如 *.txt。 允许使用通配符。

    Type:String[] Position:Named Default value:None Accept pipeline input:False Accept wildcard characters:True

    -InputObject

    指定要搜索的文本。 输入一个包含该文本的变量,或键入可获取该文本的命令或表达式。

    使用 InputObject 参数与将字符串向下发送到 管道 Select-String不同。

    通过管道将多个字符串传递给 Select-String cmdlet 时,它会搜索每个字符串中的指定文本,并返回包含搜索文本的每个字符串。

    使用 InputObject 参数提交字符串集合时, Select-String 会将该集合视为单个组合字符串。 Select-String 如果在任何字符串中找到搜索文本,则返回字符串作为一个单元。

    FileInfo 对象被视为文件的路径。 指定文件路径时, Select-String 搜索文件的内容,而不是 ToString() 对象的表示形式。

    Type:PSObject Position:Named Default value:None Accept pipeline input:True Accept wildcard characters:False

    -List

    仅从每个输入文件返回匹配文本的第一个实例。 这是检索内容与正则表达式匹配的文件列表的最有效方法。

    默认情况下, Select-String 为找到的每个匹配项返回一个 MatchInfo 对象。

    Type:SwitchParameter Position:Named Default value:False Accept pipeline input:False Accept wildcard characters:False

    -LiteralPath

    指定要搜索的文件的路径。 LiteralPath 参数的值与键入时完全相同。 不会将任何字符解释为通配符。 如果路径包括转义符,请将其括在单引号中。 单引号指示 PowerShell 不要将任何字符解释为转义序列。 有关详细信息,请参阅 about_Quoting_Rules

    Type:String[] Aliases:PSPath, LP Position:Named Default value:None Accept pipeline input:True Accept wildcard characters:False

    -NoEmphasis

    默认情况下, Select-String 突出显示与使用 Pattern 参数搜索的模式匹配的字符串。 NoEmphasis 参数禁用突出显示。

    强调使用基于 PowerShell 背景和文本颜色的负色。 例如,如果 PowerShell 颜色是带有白色文本的黑色背景。 强调的是带有黑色文本的白色背景。

    此参数是在 PowerShell 7 中引入的。

    Type:SwitchParameter Position:Named Default value:False Accept pipeline input:False Accept wildcard characters:False

    -NotMatch

    NotMatch 参数查找与指定模式不匹配的文本。

    Type:SwitchParameter Position:Named Default value:False Accept pipeline input:False Accept wildcard characters:False

    -Path

    指定要搜索的文件的路径。 允许使用通配符。 默认位置为本地目录。

    指定目录中的文件,例如 log1.txt*.doc*.*。 如果仅指定一个目录,则该命令将失败。

    Type:String[] Position:1 Default value:Local directory Accept pipeline input:True Accept wildcard characters:True

    -Pattern

    指定要在每行上查找的文本。 模式值被视为正则表达式。

    若要了解正则表达式,请参阅 about_Regular_Expressions

    Type:String[] Position:0 Default value:None Accept pipeline input:False Accept wildcard characters:False

    -Quiet

    指示 cmdlet 返回一个布尔值 (True 或 False) ,而不是 MatchInfo 对象。 如果找到模式,则值为 True;否则值为 False。

    Type:SwitchParameter Position:Named Default value:False Accept pipeline input:False Accept wildcard characters:False

    使 cmdlet 仅输出匹配的字符串,而不是 MatchInfo 对象。 这是与 Unix grep 或 Windows findstr.exe 命令最相似的行为的结果。

    此参数是在 PowerShell 7 中引入的。

    Type:SwitchParameter Position:Named Default value:False Accept pipeline input:False Accept wildcard characters:False

    -SimpleMatch

    指示 cmdlet 使用简单匹配而不是正则表达式匹配。 在简单匹配中, Select-String 在输入中搜索 Pattern 参数中的文本。 它不会将 Pattern 参数的值解释为正则表达式语句。

    此外,使用 SimpleMatch 时,返回的 MatchInfo 对象的 Matchs 属性为空。

    当此参数与 AllMatches 参数一起使用时,将忽略 AllMatches

    Select-Stringgrep类似于 UNIX 或 findstr.exe Windows 中的 。

    sls cmdlet 的Select-String别名是在 PowerShell 3.0 中引入的。

    根据 PowerShell 命令的已批准谓词,cmdlet 的官方别名前缀 Select-*sc,而不是 sl。 因此, 的正确别名 Select-String 应为 scs,而不是 sls。 这是此规则的例外。

    将 对象管道传递到 Select-String时:

  • FileInfo 对象被视为文件的路径。 指定文件路径时, Select-String 搜索文件的内容,而不是 ToString() 对象的表示形式。
  • ToString()通过管道传递的对象的结果与 PowerShell 的格式设置系统生成的富字符串表示形式不同。 因此,可能需要先通过管道将对象传递给 Out-String 。 有关详细信息,请参阅示例 10。
  • 若要使用 Select-String,请键入要查找的文本作为 Pattern 参数的值。 若要指定要搜索的文本,请使用以下条件:

  • 在带引号的字符串中键入文本,然后通过管道将其传递给 Select-String
  • 将文本字符串存储在变量中,然后将该变量指定为 InputObject 参数的值。
  • 如果文本存储在文件中,请使用 Path 参数指定文件的路径。
  • 默认情况下, Select-StringPattern 参数的值解释为正则表达式。 有关详细信息,请参阅 about_Regular_Expressions。 可以使用 SimpleMatch 参数替代正则表达式匹配。 SimpleMatch 参数在输入中查找 Pattern 参数值的实例。

    的默认输出 Select-StringMatchInfo 对象,其中包括有关匹配项的详细信息。 在文件中搜索文本时, 对象中的信息非常有用,因为 MatchInfo 对象具有 FilenameLine 等属性。 如果输入不是来自该文件,则这些参数的值为 InputStream

    如果不需要 MatchInfo 对象中的信息,请使用 Quiet 参数。 Quiet 参数返回一个布尔值 (True 或 False) ,以指示它是否找到了匹配项,而不是 MatchInfo 对象。

    匹配短语时, Select-String 使用为系统设置的当前区域性。 若要查找当前区域性,请使用 Get-Culture cmdlet。

    若要查找 MatchInfo 对象的属性,请键入以下命令:

    Select-String -Path test.txt -Pattern 'test' | Get-Member | Format-List -Property *

  • about_Automatic_Variables
  • about_Comparison_Operators
  • about_Functions
  • about_Quoting_Rules
  • about_Regular_Expressions
  • Get-Alias
  • Get-ChildItem
  • Get-Command
  • Get-Member
  • Get-WinEvent
  • Out-File
  •