【问题标题】:How to pipe results of a foreach loop to an output file?如何将 foreach 循环的结果通过管道传输到输出文件?
【发布时间】:2021-07-16 04:30:17
【问题描述】:

我有以下代码从列表中获取用户名,然后检索他们的电子邮件。 我希望将其输出以最终将自动电子邮件发送到这些特定地址。

使用下面的代码,只有文本文件中的最后一个对象被记录在 outfile 中。

$users = (get-content c:\temp\Fredro.txt)
foreach ($EUT in $users) {
Get-ADUser -Identity $EUT | Select-Object UserPrincipalName | Out-File -filepath C:\temp\exomailinglist.txt}

如何将 foreach 循环的结果通过管道传输到输出文件?

【问题讨论】:

  • 尝试将-Append 添加到Out-File。看起来没有任何错误的逻辑,所以试一试。你也可以去掉 (Get-Content ...) 周围的 grouping operator,除非你想强制它是一个数组,你应该使用 array subexpression operator @改为 987654325@。

标签: powershell pipe output pipeline


【解决方案1】:

如果找到 ADUser,您将在每次通过 foreach 循环时覆盖文件。正如 cmets 中提到的 Abraham Zinala 所提到的,如果您要将 -Append 添加到 Out-File cmdlet,这将解决您的文件仅包含最后一项的问题。我还建议将-ExpandProperty 添加到Select-Object 以避免每次都将标题“UserPrincipalName”添加到文件中。

$users = (Get-Content c:\temp\Fredro.txt)
foreach ($EUT in $users) {
    Get-ADUser -Identity $EUT | 
        Select-Object -ExpandProperty UserPrincipalName | 
            Out-File -FilePath C:\temp\exomailinglist.txt -Append
}

而不是在 foreach 循环中为每个用户写入文件,但我建议先捕获所有 ADUser,然后将所有项目一次写入文件,可能像这样:

$users = (Get-Content c:\temp\Fredro.txt)
$adUsers = foreach ($EUT in $users) {
    Get-ADUser -Identity $EUT | 
        Select-Object -ExpandProperty UserPrincipalName 
}
$adUsers | Out-File -FilePath C:\temp\exomailinglist.txt 

最后,我认为最好的选择是将它们全部组合到一个管道中,如下所示。

Get-Content c:\temp\Fredro.txt | 
    Get-ADUser | 
        Select-Object -ExpandProperty UserPrincipalName | 
            Out-File -FilePath C:\temp\exomailinglist.txt 

此方法将完全避免 foreach 循环。 Get-ADUser 接受来自管道 byvalue 的身份,因此我们可以直接从 Get-Content 管道传输每一行。 Out-File 将等待管道中的所有项目,然后再写入文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2019-01-24
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多