我有一个DisplayNames列表,我不想查找每个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
您可以通过捕获If
调用的结果,在ForEach-Object
循环中使用Get-ADUser
语句执行此操作,然后在找到用户时输出samaccountname,如果未找到则输出空字符串。
Get-Content C:\list.txt |
ForEach-Object {
If(($User=Get-ADUser -Filter "DisplayName -eq '$_'")){
$User.SamAccountName
}else{
''
}
}
400 DisplayNames减去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
首先,抛开:最好是avoid the use of script blocks ({ ... }
) as -Filter
arguments,这就是下面的解决方案使用字符串参数的原因。
Get-AdUser
与-Filter
参数匹配没有用户悄悄地返回“没有”(实际上,$null
),因此,访问.SamAccountName
属性,“没有”返回$null
。$null
,但它不会打印;如果将其转换为字符串,则可以将其打印为空行:因此:
Get-Content C:\list.txt | ForEach-Object {
[string] (Get-ADUser -Filter "DisplayName -eq `"$_`"").SamAccountName
}
但是,要提供上下文,请考虑在每次迭代中输出包含输入显示名称的[pscustomobject]
实例,如LotPings' helpful answer所示。