在 Powershell 中保持换行符以进行循环



我有一个显示名称列表,我不想查找每个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的有用答案所示。

最新更新