我有一个显示名称列表,我不想查找每个SamAccountNames,但是当我这样做时,我想在找不到SamAccountName时保留一个空行。 现在,当我针对我的 400 个 DisplayNames 列表运行它时,输出只有 350,但我不知道列表中缺少的 50 个在哪里。 我现在拥有的是:
Get-Content C:list.txt | ForEach-Object {(Get-ADUser -Filter {DisplayName -eq $_}).SamAccountName}
我对确实产生空行的其他命令使用了类似的语法,但据我所知,使用 -Filter 似乎改变了它,导致空行不再存在。
所以,而不是这样的东西:
jonesb
williamsj
bakere
我得到:
jonesb
williamsj
bakere
您可以使用 ForEach-Object
循环中的 If
语句执行此操作,方法是捕获Get-ADUser
调用的结果,然后在找到用户时输出 samaccountname,如果未找到用户,则输出空字符串。
Get-Content C:list.txt |
ForEach-Object {
If(($User=Get-ADUser -Filter "DisplayName -eq '$_'")){
$User.SamAccountName
}else{
''
}
}
400 个显示名称减去 350 个 SamAccountNames 得到 10?
我更喜欢一个输出,你会看到无法评估SamAccountName的显示名称。
$Data = foreach ($DisplayName in (Get-Content C:list.txt)){
[PSCustomObject]@{
DisplayName = $DisplayName
SamAccountName = (Get-ADUser -Filter "DisplayName -eq '$DisplayName'").SamAccountName
}
}
$Data | Out-GridView
$Data | Export-Csv C:list.csv -NoTypeInformation
首先,题外话:最好避免使用脚本块({ ... }
(作为-Filter
参数,这就是为什么下面的解决方案使用字符串参数的原因。
-
将
Get-AdUser
与不匹配的-Filter
参数一起使用 没有用户 悄悄返回"无"(实际上是$null
(,因此,访问该"无"上的.SamAccountName
属性将返回$null
。 -
虽然输出中存在这样的
$null
,但它不会打印;如果将其转换为字符串,则可以将其打印为空行:
因此:
Get-Content C:list.txt | ForEach-Object {
[string] (Get-ADUser -Filter "DisplayName -eq `"$_`"").SamAccountName
}
但是,为了提供上下文,请考虑在每次迭代中输出一个包含输入显示名称的[pscustomobject]
实例,如 LotPings的有用答案所示。