2012-05-22 53 views
4

我正在構建一個列出所有非活動計算機帳戶的腳本。我想從結果中排除一些系統。

我有一個包含所有系統要排除一個文本文件(每行一個系統名稱)。所有項目都存儲在屬性名稱爲「name」的對象中。所以$排除包含:

name 
---- 
system1 
system2 

要列出我使用Search-ADAccount cmdlet的所有非活動系統:

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

當然,我也可以遍歷所有結果1的1位,但有一個簡單的方法直接從結果中排除系統?我有一種感覺,它可以使用select-object或where-object,但我無法弄清楚如何與對象中的結果進行比較。

回答

3

導入排除文件(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} 
+0

這是不可能的:排除文件實際上還包含註釋(=一行以a;開頭的行)和blanc行。我不希望它們包含在我的$ exclused對象中。 – Walter81

+0

你沒有在你的問題中提到這一點。你可以用下面的方法解決它:Import-csv exclude.txt |其中{$ _。Name -match'\ S'和$ _。Name -notlike「; *」} –

+0

感謝您的提示。不幸的是這個命令返回一個空對象。 import-csv excluded.txt的作品。但是當我添加foreach或where語句時,它會返回一個空集 – Walter81

0

我認爲你可以使用-notcontainsTechNet article)操作:

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

抱歉,我之前嘗試過,但它不工作,我認爲這是因爲$ InActiveComputers包含更多項目(SamAccountName,Name,Enabled,SID,...),而$ Excluded僅包含「name」。配合他們? – Walter81

11

您在使用基本上是正確的這在您的標題:「其中{_.Name不是在$對象}」

語法是有點不同。它管下面

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

OR

Where { $_.Name -notin $excluded } 

兩個似乎給控制檯相同的結果。快樂的編碼!

注:PSV2和v3測試這一點。

我碰到這個跑了尋找答案的時候,並想我會使用這些選項的其他人遇到這種更新。

+0

什麼是PSV2的$ PSVersionTable.PSVersion值測試你? – mlhDev

+1

@Matthew對不起,我是在工作的筆記本電腦,我沒有了,所以我不能肯定地說,運行此,我不」回想一下精確的powershell小版本是什麼,只記得主要版本 我做了一些挖掘,發現這個:https://technet.microsoft.com/en-us/library/hh847759。aspx 它顯示Powershell v3引入了-notin,因此您必須使用第一種方法才能使此工作在v2中(其中{!($ _。Name -in $ excluded)})。希望這可以幫助! –