Select-String
cmdlet 使用正则表达式匹配来搜索输入字符串和文件中的文本模式。 可以使用
Select-String
,它类似于 UNIX 中的
grep
或 Windows 中的
findstr.exe
。
Select-String
基于文本行。 默认情况下,
Select-String
将查找每行中的第一个匹配项,并且对于每个匹配项,它都将显示文件名、行号和包含该匹配项的行中的所有文本。 可以指示
Select-String
查找每行的多个匹配项、显示该匹配项的前后文本,或显示一个用于指示是否找到匹配项的布尔值(True 或 False)。
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
使用
模式
参数来指定
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
的所有文件。
模式
参数指定要匹配
Get-
的文本。
Select-String
在 PowerShell 控制台中显示输出。 文件名和行号位于每个内容行前面,其中包含
模式
参数的匹配项。
示例 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 使用两个参数:
路径
和
模式
。
路径
参数使用指定 PowerShell 目录的变量
$PSHOME
。 路径的其余部分包括子目录
en-US
,并指定目录中的每个
*.txt
文件。
模式
参数指定匹配每个文件中的问号 (
?
)。 反斜杠 (
\
) 用作转义字符,并且是必需的,因为问号 (
?
) 是正则表达式限定符。
Select-String
在 PowerShell 控制台中显示输出。 文件名和行号位于每个内容行前面,其中包含
模式
参数的匹配项。
示例 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 安装目录,其中包含指定目录中每个
*.txt
文件的子目录
en-US
。
函数中的
Select-String
命令使用
路径
和
模式
参数。
路径
参数使用
$PSHelp
变量来获取路径。
模式
参数使用字符串
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
是事件的一个属性。
模式
参数指定字符串
失败
,并在
$_.message
中搜索匹配项。
Select-String
在 PowerShell 控制台中显示输出。
示例 6:在子目录中查找字符串
此示例在目录及其所有子目录中搜索特定文本字符串。
Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive
Get-ChildItem
使用
路径
参数指定
C:\Windows\System32*.txt
。
递归
参数包括子目录。 对象沿着管道发送到
Select-String
。
Select-String
使用
模式
参数并指定
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
使用
路径
参数指定
Command.txt
文件。
模式
参数指定
获取
和
设置
作为搜索模式。
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: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
Get-Command
cmdlet 将对象向下发送到
Out-File
,以在当前目录中创建
Command.txt
文件。
Select-String
使用
路径
参数指定
Command.txt
文件。
模式
参数指定
Get-Computer
作为搜索模式。
上下文
参数使用前后两个值,并用尖括号 (
>
) 标记输出中的模式匹配。
上下文
参数输出第一个模式匹配之前的两行和最后一个模式匹配之后的三行。
示例 9:查找所有模式匹配项
此示例演示
AllMatches
参数如何查找文本行中的每个模式匹配项。 默认情况下,
Select-String
仅查找文本行中模式的第一个匹配项。 此示例使用通过
Get-Member
cmdlet 找到的对象属性。
$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
Get-ChildItem
cmdlet 使用路径参数。 路径参数使用指定 PowerShell 目录的变量 $PSHOME
。 路径的其余部分包括子目录 en-US,并指定目录中的每个 *.txt
文件。 Get-ChildItem
对象存储在 $A
变量中。 $A
变量沿管道向下发送到 Select-String
cmdlet。 Select-String
使用模式参数在每个文件中搜索字符串 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 的次数。
示例 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 对象,但该对象的 Matches 属性包含所有匹配项。
与 SimpleMatch 参数结合使用时,此参数将被忽略。 如果要返回所有匹配项,并且要搜索的模式包含正则表达式字符,则必须对这些字符进行转义,而不是使用 SimpleMatch。 有关转义正则表达式的详细信息,请参阅 about_Regular_Expressions。
捕获与模式匹配的行前后的指定行数。
如果你输入一个数字作为此参数的值,则该数字将确定捕获的匹配项前后的行数。 如果你输入两个数字作为此参数的值,则第一个数字将确定该匹配项前面的行数,第二个数字将确定该匹配项后面的行数。 例如 -Context 2,3
。
在默认显示中,由该显示内容第一列中的右尖括号 (>
) (ASCII 62) 指示具有匹配项的行。 无标记行是上下文。
上下文参数不会更改 Select-String
生成的对象数。
Select-String
会为每个匹配项生成一个 MatchInfo 对象。 上下文将作为一个字符串数组存储在对象的 Context 属性中。
当 Select-String
命令的输出通过管道传递给另一个 Select-String
命令时,接收命令仅搜索匹配行中的文本。 匹配行是 MatchInfo 对象 Line 属性的值,而不是上下文行中的文本。 因此,上下文参数对于接收的 Select-String
命令无效。
当上下文包含匹配项时,每个匹配项的 MatchInfo 对象都将包括所有的上下文行,但重叠的行只能在显示内容中出现一次。
Type:Int32[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False
-Culture
指定与指定模式匹配的区域性名称。 区域性参数必须与 SimpleMatch 参数一起使用。 默认行为使用当前 PowerShell 运行空间(会话)的区域性。
若要获取所有受支持的区域性的列表,请使用 Get-Culture -ListAvailable
命令。
此外,此参数接受下列参数:
CurrentCulture,即默认值;
序号,即非语言二进制比较;
固定的,即区域性独立比较。
使用 Select-String -Culture Ordinal -CaseSensitive -SimpleMatch
命令,可以获取最快的二进制比较。
区域性参数使用 Tab 补全来滚动浏览指定可用区域性的参数列表。 若要列出所有可用参数,请使用以下命令:
(Get-Command Select-String).Parameters.Culture.Attributes.ValidValues
有关 .NET CultureInfo.Name 属性的详细信息,请参阅 CultureInfo.Name。
PowerShell 7 中引入了区域性参数。
Type:String
Position:Named
Default value:Culture of the current PowerShell session
Required:False
Accept pipeline input:False
Accept wildcard characters:False
-Encoding
指定目标文件的编码类型。 默认值为 utf8NoBOM
。
此参数的可接受值如下所示:
ascii
:对 ASCII(7 位)字符集使用编码。
ansi
:对当前区域性的 ANSI 代码页使用编码。 此选项是在 PowerShell 7.4 中添加的。
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
:不使用字节顺序标记 (BOM) 以 UTF-8 格式进行编码
utf32
:采用 UTF-32 格式编码。
从 PowerShell 6.2 开始,Encoding 参数还允许注册代码页的数字 ID(如 -Encoding 1251
)或已注册代码页的字符串名称(如 -Encoding "windows-1251"
)。 有关详细信息,请参阅 Encoding.CodePage .NET 文档。
从 PowerShell 7.4 开始,可以使用 Encoding 参数的 Ansi
值来传递当前区域性 ANSI 代码页的数字 ID,而无需手动指定它。
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
Required:False
Accept pipeline input:False
Accept wildcard characters:False
-Exclude
排除指定项。 此参数值使 Path 参数有效。 请输入路径元素或模式,例如 *.txt
。 允许使用通配符。
Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:True
-Include
包括指定项。 此参数值使 Path 参数有效。 请输入路径元素或模式,例如 *.txt
。 允许使用通配符。
Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:True
指定要搜索的文本。 输入一个包含该文本的变量,或键入可获取该文本的命令或表达式。
使用 InputObject 参数与将字符串沿管道发送到 Select-String
不同。
通过管道将多个字符串传递给 Select-String
cmdlet 时,它会在每个字符串中搜索指定文本并返回包含搜索文本的每个字符串。
使用 InputObject 参数提交字符串集合时,Select-String
将集合视为单个组合字符串。 如果 Select-String
在任何字符串中找到搜索文本,则会将字符串作为一个单元返回。
FileInfo 对象被视为文件的路径。 指定文件路径时,Select-String
会搜索文件的内容,而不是对象的 ToString()
表示形式。
Type:PSObject
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False
-List
每个输入文件仅返回匹配文本的第一个实例。 这是检索内容与正则表达式匹配的文件列表的最有效方法。
默认情况下,Select-String
会为其找到的每个匹配项返回一个 MatchInfo 对象。
Type:SwitchParameter
Position:Named
Default value:False
Required: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
Required:True
Accept pipeline input:True
Accept wildcard characters:False
-NoEmphasis
默认情况下,Select-String
突出显示与使用模式参数搜索的模式匹配的字符串。 NoEmphasis 参数禁用突出显示。
强调使用基于 PowerShell 背景和文本颜色的负色。 例如,如果 PowerShell 颜色是带有白色文本的黑色背景。 强调是带有黑色文本的白色背景。
在 PowerShell 7 中引入了此参数。
Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False
-NotMatch
NotMatch 参数查找与指定模式不匹配的文本。
Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False
-Path
指定要搜索的文件的路径。 允许使用通配符。 默认位置为本地目录。
指定目录中的文件,例如 log1.txt
、*.doc
或 *.*
。 如果仅指定一个目录,则该命令将失败。
Type:String[]
Position:1
Default value:Local directory
Required:True
Accept pipeline input:True
Accept wildcard characters:True
-Pattern
指定要在每行上查找的文本。 模式值被视为正则表达式。
若要了解正则表达式,请参阅 about_Regular_Expressions。
Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False
-Quiet
指示 cmdlet 返回布尔值(True 或 False),而不是 MatchInfo 对象。 如果找到模式,则值为 True;否则,值为 False。
Type:SwitchParameter
Position:Named
Default value:False
Required: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
Required:True
Accept pipeline input:False
Accept wildcard characters:False
-SimpleMatch
指示 cmdlet 使用简单匹配而不是正则表达式匹配。 在简单匹配中,Select-String
在输入中搜索模式参数中的文本。 它不会将模式参数的值解释为正则表达式语句。
此外,当使用 SimpleMatch 时,返回的 MatchInfo 对象的 Matches 属性为空。
当此参数与 AllMatches 参数一起使用时,AllMatches 将被忽略。
Select-String
类似于 UNIX 中的 grep
或 Windows 中的 findstr.exe
。
Select-String
cmdlet 的 sls
别名在 PowerShell 3.0 中引入。
根据 PowerShell 命令批准的谓词,Select-*
cmdlet 的官方别名前缀是 sc
,而不是 sl
。 因此,Select-String
的正确别名应是 scs
,而不是 sls
。 这是此规则的例外。
通过管道将对象传递至 Select-String
时:
FileInfo 对象被视为文件的路径。 指定文件路径时,Select-String
会搜索文件的内容,而不是对象的 ToString()
表示形式。
管道化对象的 ToString()
结果与 PowerShell 格式化系统生成的丰富字符串表示形式不同。 因此,可能需要通过管道将对象传递给 Out-String
。 有关详细信息,请参阅示例 10。
若要使用 Select-String
,请将要查找的文本作为模式参数的值键入。 若要指定要搜索的文本,请使用以下条件:
在带引号的字符串中键入文本,然后通过管道将其传递给 Select-String
。
将文本字符串存储在变量中,然后将该变量指定为 InputObject 参数的值。
如果文本存储在文件中,请使用途径参数指定文件路径。
默认情况下,Select-String
会将模式参数的值解释为正则表达式。 有关详细信息,请参阅 about_Regular_Expressions。 可以使用 SimpleMatch 参数重写正则表达式匹配。 SimpleMatch 参数将在输入中查找模式参数值的实例。
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 *
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