Select-String 对每个(按需字符串化[1])输入对象进行操作。
-
一个多行字符串,例如"abc`r`ndef"是一个单输入对象。
- 相比之下,
"abc", "def" 是一个字符串数组,有两个元素,作为两个输入对象传递。
-
要确保多行字符串的 行 单独传递,请使用 PowerShell 的 @ 将字符串拆分为 行数组 987654329@运营商:"abc`r`ndef" -split "`r?`n"
- (
? 使 `r 可选,以便也正确处理 `n-only(LF-only,Unix 风格)行尾。)
简而言之:
"abc`r`ndef" -split "`r?`n" | Select-String -Pattern "abc"
等效的,使用带有正则表达式 (regex) 转义序列的 PowerShell 字符串文字(-split 的 RHS 是一个正则表达式):
"abc`r`ndef" -split '\r?\n' | Select-String -Pattern "abc"
有点遗憾的是,Select-String 文档谈到了对 行 文本进行操作,因为真正的操作单元是输入 对象 - 它本身可能包括正如我们所见,多行。
这可能来自典型通过Get-Content cmdlet 提供输入对象的用例,它一行一行地输出文本文件的行。
请注意,Select-String 不会直接返回匹配字符串,而是将它们包装在包含有关匹配的有用元数据的 [Microsoft.PowerShell.Commands.MatchInfo] 对象中。
然而,即使存在线条隐喻,因为它是包含匹配 string 的 .Line 属性。
[1] 可选阅读:Select-String 如何对输入对象进行字符串化
如果输入对象已经不是字符串,则将其转换为字符串,尽管可能不是您所期望的方式:
简单地说,.ToString() 方法是在每个非字符串输入对象上调用的[2]
,对于非字符串,它 not 与您使用 PowerShell 的 默认输出格式 获得的表示相同(后者是您在例如,将对象打印到控制台或使用Out-File);相比之下,它是与您在双引号字符串中使用 字符串插值 获得的相同表示(当您在"..." 中嵌入变量引用或命令时,例如,@ 987654346@ 或 "$(Get-Date)")。
通常,.ToString() 只产生对象的类型 的名称,而不包含任何特定于实例的信息;例如,$PSVersionTable 字符串化为 System.Management.Automation.PSVersionHashTable。
# Matches NOTHING, because Select-String sees
# 'System.Management.Automation.PSVersionHashTable' as its input.
$PSVersionTable | Select-String PSVersion
如果您确实想逐行搜索默认输出格式,请使用以下成语:
... | Out-String -Stream | Select-String ...
但是,请注意,对于非字符串输入,通过查询属性使用Where-Object 条件过滤输入会更稳健,更适合后续处理。
也就是说,有充分的理由证明Select-String 需要隐式应用Out-String -Stream 字符串化,如this GitHub feature request 中所述。 p>
[2] 更准确地说,.psobject.ToString() 被按原样调用,或者 - 如果对象的 ToString 方法支持 IFormatProvider 类型的参数 - 作为 .psobject.ToString([cultureinfo]::InvariantCulture) 来获得culture-invariant 表示 - 请参阅 this answer 了解更多信息。