首页 > 解决方案 > 当将结果存储在变量中发送到电子邮件时,所有结果显示在 1 行中

问题描述

当我在 powershell 中看到结果时,它非常好,但是在发送到电子邮件后,$list 中的所有结果都显示在 1 行中。我的代码有问题吗?

$servers = "serveraddress"
$recipients = "anything@gmail.com" 

foreach ($server in $servers){
    Write-Output $server
    $list = Invoke-command -computer $server {$profiles = Get-ChildItem -Recurse -path c:\TestFolder aaa.xml; 
    foreach ($p in $profiles){
        $p.fullname
    }
    }

}
$list
if ($list -ne $null){
    Send-MailMessage -From noreply@gmail.com -To $recipients -Subject "Something Wrong" -Body “Server: $($server)`nLocations:`n$list`n” -SmtpServer smtp.abc.com
}
else
{
    #do nothing
}

目前结果将显示如下,我想将所有位置以下的行都放在新行中。

Server: serveraddress
Locations:
c:\TestFolder\AAA\aaa.xml c:\TestFolder\bbb\aaa.xml

标签: powershell

解决方案


如果我正确理解了这个问题,我建议这样做:

$servers    = "serveraddress"
$recipients = "anything@gmail.com" 

$list = foreach ($server in $servers) {
    $files = Invoke-Command -ComputerName $server {(Get-ChildItem -Path 'c:\TestFolder' -Filter 'aaa.xml' -File -Recurse).FullName}
    # next join everything with newlines to output a block of text that gets collected in array variable $list
    # DO NOT OUTPUT ANYTHING ELSE HERE
    if ($files) {
        "Server: $server{0}Locations:{0}{1}{0}" -f [Environment]::NewLine, ($files -join [Environment]::NewLine)
    }
}


if ($list) {
    # show on screen
    $list

    # create a hashtable with parameters for Send-MailMessage
    $mailParams = @{
        From       = 'noreply@gmail.com'
        To         = $recipients
        Subject    = 'Something Wrong'
        Body       = ($list -join [Environment]::NewLine)
        SmtpServer = 'smtp.abc.com'
    }
    # send the email
    Send-MailMessage @mailParams
}
else {
    #do nothing
}

注意我在cmdlet上使用Splatting 。Send-MailMessage这样做会创建更易于维护的代码。

输出看起来像:

服务器:server1
地点:
c:\TestFolder\AAA\aaa.xml
c:\TestFolder\bbb\aaa.xml

服务器:server2
地点:
c:\TestFolder\CCC\aaa.xml
c:\TestFolder\DDD\aaa.xml
c:\TestFolder\EEE\aaa.xml

如果您使用 switch 将邮件正文设置为 HTML ,则将代码中-BodyAsHtml所有出现的 替换为[Environment]::NewLine'<br />'


推荐阅读