Select-String
查找字符串和文件中的文本。
语法
File (默认值)
Select-String
[-Pattern] <string[]>
[-Path] <string[]>
[-SimpleMatch]
[-CaseSensitive]
[-Quiet]
[-List]
[-Include <string[]>]
[-Exclude <string[]>]
[-NotMatch]
[-AllMatches]
[-Encoding <string>]
[-Context <Int32[]>]
[<CommonParameters>]
Object
Select-String
[-Pattern] <string[]>
-InputObject <psobject>
[-SimpleMatch]
[-CaseSensitive]
[-Quiet]
[-List]
[-Include <string[]>]
[-Exclude <string[]>]
[-NotMatch]
[-AllMatches]
[-Encoding <string>]
[-Context <Int32[]>]
[<CommonParameters>]
LiteralFile
Select-String
[-Pattern] <string[]>
-LiteralPath <string[]>
[-SimpleMatch]
[-CaseSensitive]
[-Quiet]
[-List]
[-Include <string[]>]
[-Exclude <string[]>]
[-NotMatch]
[-AllMatches]
[-Encoding <string>]
[-Context <Int32[]>]
[<CommonParameters>]
说明
该 Select-String cmdlet 在输入字符串和文件中搜索文本和文本模式。 您可以在 UNIX 中使用 Select-String 类似于 grep 或在 Windows 中使用 findstr.exe 的类似方法。
Select-String 基于文本行。 默认情况下,Select-String 在每个行中查找第一个匹配项,并且对于每个匹配项,它显示包含匹配项的行中的文件名、行号和所有文本。 可以指示 Select-String 查找每行的多个匹配项、在匹配前后显示文本,或显示指示是否找到匹配项的布尔值(True 或 False)。
Select-String 使用正则表达式匹配,但它也可以执行匹配,在输入中搜索您指定的文本。
Select-String 可以在每个输入文件中的第一个匹配项之后显示所有文本匹配项或停止。
Select-String 可用于显示与指定模式不匹配的所有文本。
还可以指定 Select-String 应需要特定的字符编码,例如在搜索 Unicode 文本的文件时。
Select-String 使用字节顺序标记(BOM)来检测文件的编码格式。 如果文件没有 BOM,则假定编码为 UTF8。
示例
示例 1:查找区分大小写的匹配项
此示例对将管道发送到 Select-String cmdlet 的文本执行区分大小写的匹配。
'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 与 Out-File cmdlet 一起使用,在当前目录中创建两个文本文件,Alias.txt 和 Command.txt。
Select-String 使用带星号()通配符的 * 参数搜索当前目录中具有文件扩展名 .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。
PS> Function Search-Help
>> {
>> $PSHelp = "$PSHOME\en-US\*.txt"
>> Select-String -Path $PSHelp -Pattern 'About_'
>> }
PS>
PS> Search-Help
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:2: about_ActivityCommonParameters
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:31: see about_WorkflowCommonParameters.
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:33: about_CommonParameters.
该函数在 PowerShell 命令行上创建。 该 Function 命令使用名称 Search-Help。 按 Enter 开始向函数添加语句。 在 >> 提示符下,添加每个语句,然后按 Enter,如示例中所示。 添加右括号后,将返回到 PowerShell 提示符。
该函数包含两个命令。
$PSHelp 变量存储 PowerShell 帮助文件的路径。
$PSHOME 是 PowerShell 安装目录,其中包含指定目录中每个 文件的子目录 *.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'
Get-WinEvent cmdlet 使用 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
Get-Command cmdlet 将对象向下发送到 Out-File,以在当前目录中创建 Command.txt 文件。
Select-String 使用 Path 参数指定 Command.txt 文件。
Pattern 参数将 获取 和 设置为搜索模式。
NotMatch 参数从结果中排除 获取 和 集。
Select-String 在 PowerShell 控制台中显示不包含 获取 或 设置的输出。
示例 8:查找匹配前后的行
此示例演示如何在匹配模式前后获取行。
Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get-Computer' -Context 2, 3
Command.txt:1186:Cmdlet Get-CmsMessage 3.0.0.0 Microsoft.PowerShell.Security
Command.txt:1187:Cmdlet Get-Command 3.0.0.0 Microsoft.PowerShell.Core
> Command.txt:1188:Cmdlet Get-ComputerInfo 3.1.0.0 Microsoft.PowerShell.Management
> Command.txt:1189:Cmdlet Get-ComputerRestorePoint 3.1.0.0 Microsoft.PowerShell.Management
Command.txt:1190:Cmdlet Get-Content 3.1.0.0 Microsoft.PowerShell.Management
Command.txt:1191:Cmdlet Get-ControlPanelItem 3.1.0.0 Microsoft.PowerShell.Management
Command.txt:1192:Cmdlet Get-Counter 3.0.0.0 Microsoft.PowerShell.Diagnostics
Get-Command cmdlet 将对象向下发送到 Out-File,以在当前目录中创建 Command.txt 文件。
Select-String 使用 Path 参数指定 Command.txt 文件。
Pattern 参数指定 Get-Computer 作为搜索模式。
Context 参数使用两个值,前后使用尖括号(>)标记输出中的模式匹配项。
Context 参数输出第一个模式匹配之前的两行,最后一个模式匹配后的三行。
示例 9:查找所有模式匹配项
此示例演示如何 AllMatches 参数查找文本行中的每个模式匹配项。 默认情况下,Select-String 仅在文本行中找到模式的第一个匹配项。 此示例使用通过 Get-Member cmdlet 找到的对象属性。
PS> $A = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell'
PS> $A
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:5: Describes the parameters that Windows PowerShell
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:9: Windows PowerShell Workflow adds the activity common
PS> $A.Matches
Groups : {0}
Success : True
Name : 0
Captures : {0}
Index : 4
Length : 10
Value : PowerShell
PS> $A.Matches.Length
2073
PS> $B = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell' -AllMatches
PS> $B.Matches.Length
2200
Get-ChildItem cmdlet 使用 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-ChildItem 和 Select-String cmdlet,但添加 AllMatches 参数。
AllMatches 在每个行中查找每个模式 PowerShell。 存储在 $A 和 $B 变量中的对象是相同的。
$B.Matches.Length 属性会增加,因为对于每一行,将计算 powerShell 模式的每个匹配项。
参数
-AllMatches
指示 cmdlet 在每行文本中搜索多个匹配项。 如果没有此参数,Select-String 仅查找每行文本中的第一个匹配项。
当在一行文本中找到多个匹配项时 Select-String ,它仍然只为该行发出一个 MatchInfo 对象,但该对象的 Matches 属性包含所有匹配项。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-CaseSensitive
指示 cmdlet 匹配项区分大小写。 默认情况下,匹配项不区分大小写。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Context
捕获与模式匹配的行前后的指定行数。
如果输入一个数字作为此参数的值,该数字将确定匹配前后捕获的行数。 如果输入两个数字作为值,则第一个数字确定匹配前的行数,第二个数字确定匹配后的行数。 例如,-Context 2,3。
在默认显示中,具有匹配项的行由显示的第一列中的右尖括号(>)(ASCII 62)指示。 未标记的行是上下文。
Context 参数不会更改 Select-String生成的对象数。
Select-String 为每个匹配生成一个 MatchInfo 对象。 上下文作为字符串数组存储在对象的 Context 属性中。
将 Select-String 命令的输出向下发送到另一个 Select-String 命令时,接收命令仅搜索匹配行中的文本。 匹配行是 MatchInfo 对象的 Line 属性的值,而不是上下文行中的文本。 因此,接收 命令上 Select-String 参数无效。
当上下文包含匹配项时,每个匹配项的 MatchInfo 对象包括所有上下文行,但重叠的行仅在显示中显示一次。
参数属性
| 类型: | Int32[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Encoding
指定目标文件的编码类型。 默认值是 Default。
此参数的可接受值如下所示:
- ASCII 使用 ASCII(7 位)字符集。
- BigEndianUnicode 使用具有 big-endian 字节顺序的 UTF-16。
- 默认 使用与系统的活动代码页(通常是 ANSI)对应的编码。
- OEM 使用与系统的当前 OEM 代码页对应的编码。
- Unicode 使用具有小字节顺序的 UTF-16。
- UTF7 使用 UTF-7。
- UTF8 使用 UTF-8。
- UTF32 使用具有小字节顺序的 UTF-32。
参数属性
| 类型: | String |
| 默认值: | Default |
| 接受的值: | ASCII, BigEndianUnicode, Default, OEM, Unicode, UTF7, UTF8, UTF32 |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Exclude
排除指定的项。 此参数的值定义了 Path 参数的限定条件。 输入路径元素或模式,例如 *.txt。 允许使用通配符。
参数属性
| 类型: | String[] |
| 默认值: | None |
| 支持通配符: | True |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Include
包括指定的项。 此参数的值定义了 Path 参数的限定条件。 输入路径元素或模式,例如 *.txt。 允许使用通配符。
参数属性
| 类型: | String[] |
| 默认值: | None |
| 支持通配符: | True |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-InputObject
指定要搜索的文本。 输入包含文本的变量,或键入获取文本的命令或表达式。
使用 InputObject 参数与将字符串向下发送到 Select-String不同。
将多个字符串传递给 Select-String cmdlet 时,它会搜索每个字符串中的指定文本,并返回包含搜索文本的每个字符串。
使用 InputObject 参数提交字符串集合时,Select-String 将集合视为单个组合字符串。 如果字符串在任何字符串中找到搜索文本,Select-String 将字符串作为单位返回。
参数属性
| 类型: | PSObject |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
Object
| Position: | Named |
| 必需: | True |
| 来自管道的值: | True |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-List
仅从每个输入文件返回匹配文本的第一个实例。 这是检索内容与正则表达式匹配的列表文件的最有效方法。
默认情况下,Select-String 为每个找到的匹配项返回 MatchInfo 对象。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-LiteralPath
指定要搜索的文件的路径。 LiteralPath 参数的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包含转义字符,请将它括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。 有关详细信息,请参阅 about_Quoting_Rules。
参数属性
| 类型: | String[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
| 别名: | PSPath |
参数集
LiteralFile
| Position: | Named |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-NotMatch
NotMatch 参数查找与指定模式不匹配的文本。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Path
指定要搜索的文件的路径。 允许使用通配符。 默认位置是本地目录。
指定目录中的文件,例如 log1.txt、*.doc或 *.*。 如果仅指定目录,命令将失败。
参数属性
| 类型: | String[] |
| 默认值: | Local directory |
| 支持通配符: | True |
| 不显示: | False |
参数集
File
| Position: | 1 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-Pattern
指定要在每个行上查找的文本。 键入字符串或正则表达式。 如果键入字符串,请使用 SimpleMatch 参数。
若要了解正则表达式,请参阅 about_Regular_Expressions。
参数属性
| 类型: | String[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Quiet
指示 cmdlet 返回布尔值(True 或 False),而不是 MatchInfo 对象。 如果找到模式,则值为 True;否则,值为 False。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-SimpleMatch
指示 cmdlet 使用简单匹配而不是正则表达式匹配。 在简单的匹配中,Select-String 在 Pattern 参数中搜索文本的输入。 它不会将 Pattern 参数的值解释为正则表达式语句。
参数属性
| 类型: | SwitchParameter |
| 默认值: | False |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
CommonParameters
此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters。
输入
PSObject
您可以通过管道将任何具有 ToString 方法的对象传递给 Select-String.
输出
Microsoft.PowerShell.Commands.MatchInfo or System.Boolean
默认情况下,输出是一组 MatchInfo 对象,找到的每个匹配项对应一个对象。 如果使用 Quiet 参数,则输出是一个布尔值,指示是否找到模式。
备注
Select-String 类似于 UNIX 中的 grep 或 Windows 中的 findstr.exe 。
cmdlet 的 Select-String 别名是在 PowerShell 3.0 中引入的。
注释
根据 PowerShell 命令 批准的谓词,Select-* cmdlet 的官方别名前缀为 sc,而不是 sl。 因此,Select-String 的正确别名应 scs,而不是 sls。 这是此规则的例外。
若要使用 Select-String,请键入要查找的文本作为 Pattern 参数的值。 若要指定要搜索的文本,请使用以下条件:
- 在带引号的字符串中键入文本,然后通过管道将其传递给
Select-String。 - 将文本字符串存储在变量中,然后将变量指定为 InputObject 参数的值。
- 如果文本存储在文件中,请使用 Path 参数指定文件的路径。
默认情况下,Select-String 将 Pattern 参数的值解释为正则表达式。 (有关详细信息,请参阅 about_Regular_Expressions。
可以使用 SimpleMatch 参数替代正则表达式匹配。
SimpleMatch 参数查找输入中 Pattern 参数值的实例。
Select-String 的默认输出是 MatchInfo 对象,其中包括有关匹配项的详细信息。 在文件中搜索文本时,对象中的信息非常有用,因为 MatchInfo 对象具有 Filename 和 Line等属性。 当输入不是来自文件中时,这些参数的值 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 *