我正在尝试找到一种方法,将多个用户的 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
}
任何方向或见解,非常感谢!
谢谢你
以 Abraham Zinala 的有用评论为基础:
立即修复是将
>
替换为 >>
在 foreach
循环中:
但是,使用
>>
在循环内是最好的避免,因为它是:
效率低下,因为目标文件必须在每次迭代中打开和关闭。
不方便,因为在循环之前必须确保目标文件还不存在或为空,以免意外追加到预先存在的内容。
最好使用 pipeline 和 single Out-File
调用 /
>
操作,以流方式接收来自all 迭代的输出: 注:
foreach
statement 不能直接在管道中使用,因此需要重定向,这就是为什么下面使用类似的
ForEach-Object
cmdlet,其中 $multiple_users
数组是piped ,导致其元素被一一处理,如 automatic
$_
变量所示。
foreach
或
while
等语句包装在
& { ... }
或
. { ... }
中,以允许其参与管道;例如:
& { foreach ($i in 1..2) { $i } } > out.txt
,则它比
>
/
Out-File
更有效):使用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
是必需的:
literal路径,带有-LiteralPath
,特别是如果它包含
[
和
]
(也许令人惊讶的是,
>
和
Out-File
(通常是位置暗示的) )
-FilePath
参数将路径视为通配符表达式 - 请参阅这个答案)。
-Encoding
参数控制用于输出文件的字符编码。