PowerShell输出差异

时间:2018-06-04 21:14:12

标签: powershell

在powershell上编写命令时,输出会以一种方式传播,有时则以另一种方式传播。 假设我正在使用命令

Get-ADUser -Filter * | ? {$_.name -eq "$name"}

在这种情况下,我可以使用Where-Object,如下所示,有时会有命令以其他方式填充结果,并且由于某种原因,Where-Object无效。

稍微调查一下后,我发现Select-String对我来说对另一个命令起作用而不是Where-Object

所以它让我想知道这两个输出之间可能存在什么差异?

谢谢

顺便说一句,如果有人有一个很好的学习网站,可以从更多的内部视角教我所有PowerShell的基础知识,比如数组和哈希表之间的差异,我已经知道的,不是真正基本的东西:)

2 个答案:

答案 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-StringWhere-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个字符串的结果。

谢谢你的回答:)