输出ALL结果在foreach结束时而不是在每次运行期间

时间:2017-11-02 18:55:38

标签: powershell loops foreach

我继承了一个脚本,它循环遍历服务器列表中的一组服务器,然后为每个服务器输出一些东西。它使用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>>

2 个答案:

答案 0 :(得分:0)

您可以从for循环之外的StringBuilder变量声明开始(在它之前) [System.Text.StringBuilder] $ SB = New-Object System.Text.StringBuilder

然后FOR LOOP

答案 1 :(得分:0)

我不知道这是否是一个很好的解决方案,无论您要求与否,但您可以做的是创建一个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

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