$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-ChildItem
和 Select-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-String
grep
类似于 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-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 *
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