9

我正在构建一个列出所有非活动计算机帐户的脚本。我想从结果中排除一些系统。

我有一个包含所有要排除的系统的文本文件(每行一个系统名)。所有项目都存储在属性名称为“name”的对象中。所以 $excluded 将包含:

name
----
system1
system2

要列出所有非活动系统,我使用 Search-ADAccount cmdlet:

$InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOnly | Where {$_.Enabled -eq $true}

当然,我可以逐个循环所有结果,但是有没有一种简单的方法可以直接从结果中排除系统?我感觉可以使用 select-object 或 where-object,但我不知道如何与对象中的结果进行比较。

4

3 回答 3

22

您在标题中使用它基本上是正确的:“其中 {_.Name 不在 $object} 中”

语法有点不同。将其通过管道传输到以下

Where { !($_.Name -in $excluded) }

或者

Where { $_.Name -notin $excluded }

两者似乎都在控制台中给出了相同的结果。快乐编码!

注意:在 PSv2 和 v3 上对此进行了测试。

我在寻找答案时遇到了这个问题,并认为我会为遇到此问题的其他人更新这些选项。

于 2014-04-14T21:13:46.370 回答
4

导入排除文件(作为 csv)并使用 -notcontains 运算符:

$names = Import-csv exclude.txt | Foreach-Object {$_.Name} 

$InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOnly | Where {$_.Enabled -eq $true -and $names -notcontains $_.Name}
于 2012-05-22T08:31:07.123 回答
1

我认为您可以使用-notcontainsTechNet 文章)运算符:

$InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOnly | Where {$_.Enabled -eq $true -and $excluded -notcontains $_.name }
于 2012-05-22T08:33:08.573 回答