在 PowerShell 的同一句话中使用 Select-Object 和 Where-Object

Using Select-Object and Where-Object in same sentence with PowerShell

我是 PowerShell 的新手,我正在尝试 select Active Directory 中的一些字段,就像一些字符串,让我解释一下:

到目前为止,这是我的代码:

$csv = Import-Csv C:\Users\barreola\Desktop\test_AD.csv

$IS = @(
'*601*',
'*609*',
'*602*',
'*608*',
'*610*',
'*611*',
'*1212*',
'*603*',
'*604*'
)


$csv.Username | ForEach-Object {
    Get-ADUser $_ -Properties Department | Select-Object SamAccountName,Department
}

至此,检索到预期的数据,如下所示

SamAccountName Department                              
-------------- ----------                              
user1          First floor department (0601)
user2          Second floor department (0609)                   
user3          Second floor department (0609)                   
user4          Second floor department (0609)                   
user5          Third floor department (0604)              
user6          Fourth floor department (0707)      
user7          Fifth floor department (0500)                  
user8          Sixth floor department (1306)   
user9          First floor department (0601)

但我希望 PowerShell 只显示 $IS 中包含的内容,例如

Get-ADUser $_ -Properties Department | Select-Object SamAccountName,Department Where-Object {Department -like $IS}

预期输出为

SamAccountName Department                              
-------------- ----------                              
user1          First floor department (0601)
user2          Second floor department (0609)                   
user3          Second floor department (0609)                   
user4          Second floor department (0609)                   
user5          Third floor department (0604)   
user9          First floor department (0601)

注意:.csv 文件包含 700,000 多行。

Where-Object 可以这样做,但这不是最好的方法。您使用 Get-ADUser 的方式将检索您域中的 每个 用户。这是花费时间最长的部分。所以您不希望检索比您必须的更多的用户,因为那只会浪费您的时间。

相反,请使用 Get-ADUser-Filter 参数,以便您只向 AD 询问您想要的用户。在您的情况下,您需要这样的字符串:

Department -like *601*' -or Department -like '*609*' -or etc.

你可以通过这样做从你的数组中得到一个字符串:

"Department -like '$($IS -Join "' -or Department -like '")'"

您可以在 the documentation 中阅读有关 -Join 的内容。

但是你也不能在使用 -Filter 的同时使用 -Identity 参数($_ 被映射到的参数)。因此,您必须在过滤器中包含用户名(或 SamAccountName)。

放在一起,它会是这样的:

$csv.Username | ForEach-Object {
    Get-ADUser -Filter "SamAccountName -eq '$_' -and (Department -like '$($IS -Join "' -or Department -like '")')" -Properties Department | Select-Object SamAccountName,Department
}