【问题标题】:Output ALL results at the end of foreach instead of during each run在 foreach 结束时而不是在每次运行期间输出所有结果
【发布时间】:2017-11-02 18:55:38
【问题描述】:

我继承了一个脚本,它遍历服务器列表中的一组服务器,然后为每个服务器输出一些内容。它使用 StringBuilder 将内容附加到变量,然后吐出结果......我如何让脚本存储内容,以便我可以在最后显示它并显示整个 foreach 的结果,而不是让它打印(然后覆盖)每次迭代?

目前我的结果如下所示:

ServerName1
  Text1

下一次运行:

ServerName2
 Text 2

我如何让它存储数据,然后在最后输出以下内容以便我可以通过电子邮件发送它?

ServerName1
 Text1

ServerName2
 Text2

我的代码:

foreach($Machine in $Machines)
    {
            Invoke-Command -ComputerName $Machine -ScriptBlock{param($XML1,$XML2,$XML3,$URL)
            [System.Text.StringBuilder]$SB = New-Object System.Text.StringBuilder
            $X = $SB.AppendLine($env:COMPUTERNAME)
            if (Test-Path <path>)
            {        
                $PolResponse = <somestuff>
                $PolResponse2 = <somestuff>
                Write-Host "[1st] $PolResponse" -ForegroundColor Magenta
                Write-Host "[2nd] $PolResponse2" -ForegroundColor Magenta
                $X = $SB.AppendLine($PolResponse)
                $X = $SB.AppendLine($PolResponse2)
            }
            else
            {
                $PolResponse = "[1st] No Response"
                $PolResponse2 = "[2nd] No Response"
                Write-Host $PolResponse -ForegroundColor Red
                Write-Host $PolResponse2 -ForegroundColor Red
                $X = $SB.AppendLine($PolResponse)
                $X = $SB.AppendLine($PolResponse2)
            }
        } -ArgumentList $XML1, $XML2, $XML3, $URL
    }

    # Sending result email

    <<I want to send the TOTALITY of $SB here>>

【问题讨论】:

    标签: powershell loops foreach


    【解决方案1】:

    您可以首先将 StringBuilder 变量声明移到 for 循环之外(在它之前) [System.Text.StringBuilder]$SB = 新对象 System.Text.StringBuilder

    然后 FOR 循环

    【讨论】:

    • 感谢@codemaker。我必须完成一个基本脚本,以通过电子邮件通知任何问题,所以当我重新审视它来调整它时,我一定会试一试。
    【解决方案2】:

    我不知道这对于您的要求是否是一个很好的解决方案,但是您可以做的是创建一个 txt 文件,并且 foreach 循环中的每个循环都将信息添加到一个 txt 文件中。这是一种存储所有信息然后在最后将所有信息放在一起的方法。

    New-Item -Path "\\Path\to\file.txt" -Itemtype File
    
    Foreach(){
        $Stuff = # Do your stuff here
        Add-Content -Value $stuff -Path "\\Path\to\file.txt"
    }
    
    # Email .txt file ?
    # You could use Send-MailMessage to do this possibly
    

    希望这对您的目标有所帮助。

    【讨论】:

    • 谢谢@Cory Etmund,我会把它放在次要位置。我必须完成一个基本脚本,以便通过电子邮件通知任何问题,所以当我重新审视它来调整它时,我一定会试一试。
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2021-08-12
    相关资源
    最近更新 更多