将多个 ID 映射到 Active Directory 中的电子邮件地址并将结果输出到单个文件

2023-11-29

我正在尝试找到一种方法,将多个用户的 ID 映射到 Active Directory (AD) 中的关联电子邮件地址,然后将输出附加到 txt 文件中,最终生成包含电子邮件地址列表的单个文件。通过利用 PowerShell AD 工具的以下命令,我可以输出特定用户的电子邮件地址:

$user= testID
Get-ADUser $user -server ml -Properties * | Select-Object mail

现在,我正在尝试使其适应多个用户的工作,尽管我遇到的方法不会将每个结果附加或连接到 txt 文件。循环迭代时的每个新输出都会覆盖现有文本文件的内容。

$multiple_users = "testID1", "testID2", "testID3"
foreach ($multiple_user in $multiple_users){
    Get-ADUser $multiple_user -server ml -Properties * | Select-Object mail > ID_to_email.txt
    }

任何方向或见解,非常感谢!

谢谢


建立在亚伯拉罕·齐纳拉有用的评论:

The 即时修复是替换> with >>在你的里面foreach loop:

  • 重定向 >实际上是一个别名Out-File所以replaces每次迭代中的目标文件,这不是您想要的。

  • 相比之下,>>实际上是一个别名Out-File -Append因此appends到目标文件。

然而,using >> 在循环内是最好的avoided, 因为它是:

  • 效率低下,因为目标文件必须打开和关闭在每次迭代中.

  • 不方便,因为您必须确保目标文件在循环之前尚不存在或为空,以免意外附加到预先存在的内容。

所以,最好使用pipeline with a single Out-File call / >接收输出的操作all流式迭代:

Note:

  • A foreach 陈述不能直接在管道中使用,因此需要重定向,这就是为什么类似的原因ForEach-Object cmdlet下面使用的是$multiple_users数组是piped,导致其元素被一一处理,如自动的$_多变的.

  • 或者,您可以包装一个语句,例如foreach or while in & { ... } or . { ... }允许它参与管道;例如。:
    & { foreach ($i in 1..2) { $i } } > out.txt

  • 下面的解决方案类似地适用于使用Set-Contentcmdlet(比> / Out-File如果您知道要写入文件的对象是strings已经):使用single Set-Content在管道末尾调用(而不是调用Add-Content在每个循环迭代中)。

$multiple_users | 
  ForEach-Object {
    Get-ADUser $_ -server ml -Properties mail |
      Select-Object mail
  } > ID_to_email.txt # Write ALL output to ID_to_email.txt

代替> ID_to_email.txt,你可以使用| Out-File ID_to_email.txt反而;明确使用Out-File is required在以下情况下:

  • 强制将目标文件路径解释为literal路径,与-LiteralPath,特别是如果它包含[ and ](也许令人惊讶的是,> and Out-File与(通常是位置暗示的)-FilePath参数将路径视为wildcard表达式 - 参见这个答案).

  • 控制用于输出文件的字符编码,通过-Encoding范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个 ID 映射到 Active Directory 中的电子邮件地址并将结果输出到单个文件 的相关文章

随机推荐