Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:其中{{名称不在$object中}_Powershell_Filtering - Fatal编程技术网

Powershell:其中{{名称不在$object中}

Powershell:其中{{名称不在$object中},powershell,filtering,Powershell,Filtering,我正在生成一个脚本,列出所有不活动的计算机帐户。我想从结果中排除一些系统 我有一个文本文件,包含要排除的所有系统(每行一个系统名)。所有项目都存储在属性名为“name”的对象中。因此,不包括的美元将包含: name ---- system1 system2 要列出所有非活动系统,我使用Search-AdaAccount cmdlet: $InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOn

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

我有一个文本文件,包含要排除的所有系统(每行一个系统名)。所有项目都存储在属性名为“name”的对象中。因此,不包括的美元将包含:

name
----
system1
system2
要列出所有非活动系统,我使用Search-AdaAccount cmdlet:

$InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOnly | Where {$_.Enabled -eq $true}
当然,我可以逐个循环所有结果,但是有没有简单的方法可以直接从结果中排除系统?我觉得选择对象或where对象是可能的,但我不知道如何与对象中的结果进行比较。

导入排除文件(作为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}

我认为您可以使用
-notcontains
()运算符:

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

您在标题中使用这一点基本上是正确的:“where{{{.Name不在$object}”

语法有点不同。将其输送至以下管道:

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

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

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


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

这是不可能的:排除文件实际上还包含注释(=以a开头的行)和blanc行。我不希望它们包含在我的$exclused对象中。你在问题中没有提到这一点。您可以使用以下方法解决此问题:Import csv exclude.txt | where{$\u0.Name-match'\S'-和$\u0.Name-notlike“*”}谢谢您的提示。不幸的是,这个命令返回一个空对象。导入csv excluded.txt工作。但是当我添加foreach或where语句时,它返回一个空的setignore,忽略最后的注释。我的bad.import-csv与where-works结合在一起。但从信息上看,这不起作用。搜索ADaccounts也包括排除的项目:(抱歉,我以前尝试过,但它不起作用。我认为这是因为$InActiveComputers包含更多的项目(SamAccountName、Name、Enabled、SID等),而$excluded只包含“Name”。where object如何知道如何匹配它们?您测试的PSv2的$PSVersionTable.PSVersion值是多少?@Matthew抱歉,我在一台工作笔记本电脑上运行此程序,但我已经没有了,所以我无法确定。我不记得确切的powershell次要版本是什么。只记得主要版本。我做了一些挖掘,发现了以下内容:它显示了Powershell v3引入了-notin,因此您必须使用第一个方法才能使此方法在v2中工作(其中{!($\u.Name-in$excluded)})。希望这对您有所帮助!
Where { $_.Name -notin $excluded }