在Powershell for Loop中保持换行

问题描述 投票:1回答:3

我有一个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
powershell
3个回答
1
投票

您可以通过捕获If调用的结果,在ForEach-Object循环中使用Get-ADUser语句执行此操作,然后在找到用户时输出samaccountname,如果未找到则输出空字符串。

Get-Content C:\list.txt | 
    ForEach-Object {
        If(($User=Get-ADUser -Filter "DisplayName -eq '$_'")){
            $User.SamAccountName
        }else{
            ''
        }
    }

1
投票

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

0
投票

首先,抛开:最好是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所示。

© www.soinside.com 2019 - 2024. All rights reserved.