在powershell上编写命令时,输出会以一种方式传播,有时则以另一种方式传播。 假设我正在使用命令
Get-ADUser -Filter * | ? {$_.name -eq "$name"}
在这种情况下,我可以使用Where-Object
,如下所示,有时会有命令以其他方式填充结果,并且由于某种原因,Where-Object
无效。
稍微调查一下后,我发现Select-String
对我来说对另一个命令起作用而不是Where-Object
。
所以它让我想知道这两个输出之间可能存在什么差异?
谢谢
顺便说一句,如果有人有一个很好的学习网站,可以从更多的内部视角教我所有PowerShell的基础知识,比如数组和哈希表之间的差异,我已经知道的,不是真正基本的东西:)
答案 0 :(得分:2)
Where-Object
适用于返回符合给定条件的对象的对象集合。 Select-String
处理一组字符串,返回与给定表达式匹配的字符串。它们之间的相似之处在于它们允许您过滤 stuff 的集合。你可以过滤的东西与另一个有点不同。 Where-Object可以根据字符串属性或转换为字符串的属性来过滤对象。它还可以使用数学运算符(大于,小于,模数等)将滤波器应用于数值属性,对象比较等。
假设我有一个名为.gitignore
的文件。如果我想看到包含短语“paket”的行,我会写这样的东西:
cat .gitignore | select-string 'paket'
Select-String找到包含我正在寻找的短语的一行或多行。我可以用Where-Object
:
cat .gitignore | where { $_ -like '*paket*' }
在这种情况下,被过滤的对象恰好是一个字符串,因此Select-String
和Where-Object
看起来非常相似。
现在,让我们创建一个日期列表......
$stuff = 1..10 | foreach { $(Get-Date).AddHours($(Get-Random -Minimum 1 -Maximum 25) * -1) }
我们将按小时过滤日期列表,其中小时大于18(下午6点):
$stuff | Where-Object { $_.Hour -gt 18 }
在此示例中,我们将数学表达式(大于)应用于对象的属性。这是Select-String
不会做的事情。 Where-Object
也可以处理不会转换为字符串的值。
希望这有点帮助。
答案 1 :(得分:0)
行, 显然我设法也使用Where-Object来过滤命令结果。 这是因为我的结果是每一行都有3个字符串,所以使用" -eq"没有工作,给我一个空白的结果。 我将其更改为-match或-like **,它确实找到了行,其中包含我正在寻找的字符串。
有关更多说明,我使用的命令是" net users / domain" - 它输出每行3个字符串的结果。
谢谢你的回答:)