Powershell 通过电子邮件发送foreach输出

Powershell 通过电子邮件发送foreach输出,powershell,Powershell,我有一个脚本正在检查数据库的镜像状态。Powershell中的输出正常,但当我尝试通过邮件发送时,得到的是Microsoft.Powershell.Commands.Internal.Format.FormatteryData,而不是数据本身。我试着把它改成Out String,但是我在一行中得到了所有的结果。如何以与直接在PowerShell中格式化输出相同的方式格式化输出 # rozszerzenie do obslugi [System.Reflection.Assembly]::Loa

我有一个脚本正在检查数据库的镜像状态。Powershell中的输出正常,但当我尝试通过邮件发送时,得到的是Microsoft.Powershell.Commands.Internal.Format.FormatteryData,而不是数据本身。我试着把它改成Out String,但是我在一行中得到了所有的结果。如何以与直接在PowerShell中格式化输出相同的方式格式化输出

# rozszerzenie do obslugi 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null;


$mail_from = "xxx";
$mail_to = "xxx";
$mail_subject = "Status mirrorowanych baz";
$mail_encoding = "UTF8";
$mail_smtp = "xxx";

# lista serwerow
$list = @("SERVER01V", 
          "SERVER02V"
                );

$output = foreach($server in $list)
{
    $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $server;
    # pokaz tylko mirrorowane
    $databases = $srv.Databases | Where-Object {$_.IsMirroringEnabled -eq $true};
    Write-Output "<br>==================================<br>";  
    Write-Output $server;
    Write-Output "<br>==================================<br>";
    $databases | Select-Object -Property Name, MirroringStatus | Format-Table -AutoSize | Out-String;
    Write-Output "<br>";
}

$mail_body = $output;
Send-MailMessage -To $mail_to -From $mail_from -Subject $mail_subject -SmtpServer $mail_smtp -Encoding $mail_encoding -Body $mail_body -BodyAsHtml

您当前正在发送一封HTML邮件。这样断线就不重要了。如果您想在邮件中使用换行符,您需要使用文本格式,或者用a或类似的格式替换换行符。手动添加外观以获得一致的模式并进行替换可能是明智的做法。

尝试将所有数据收集到一个数组中,然后使用ConvertTo-HTML cmdlet和Send-MailMessage中的“BodyAsHTML”开关

$DatabaseArray=@()

ForEach ($server in $list) {
     $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $server
     $DatabaseArray += $srv.Databases | Where-Object {$_.IsMirroringEnabled -eq $true} | Select-Object Name,MirroringStatus   
}

$HTMLBody = $DatabaseArray | ConvertTo-HTML

Send-MailMessage -subject x -body $HTMLBody -BodyAsHTML

是的,但问题出在$databases行中| Select Object-Property Name,MirroringStatus | Format Table-AutoSize | Out String;。因此,邮件看起来是这样的:Name MirroringStatus------DB1 Synchronized DB2 Synchronized SSISDB Synchronized其他字符串作为单独的行,服务器名称在单独的行中。您仅有的另一行是静态服务器名称。后面是换行符,因为分隔线包含两个换行符,一个在前面,一个在后面。如果要发送HTML,则需要使用HTML换行符来显示它们。你提到的那行不知道你在发送HTML。因此,没有添加HTML换行符。您需要使用替换来手动添加它们。即使在那之后,你的输出也不会像你没有为HTML设置单空间字体那样好。好吧,也许我没有充分说明这一点。行$databases |选择对象-属性名称,镜像状态|格式表-自动调整大小|输出字符串;对于在powershell中有许多数据库的服务器来说,它看起来不错—它有一个表形式。但如何将其转换为邮件,使其看起来也像表格,或者只是用新行格式化的文本?我的意思是,我现在只得到一行字符串,而不是一个表,只是代码的一部分,它显示了特定服务器上许多数据库的状态。我知道你的问题是什么,我告诉你运行一个该死的替换,因为你发送的是HTML,这个字符串没有HTML换行符,而只是与HTML无关的常规换行符。您需要在$output上运行replace。或者不要发送HTML.aaaaaaaaa,你说得对!直到现在我才明白。我提到的这一行正在生成一个字符串,其中包含一行与powershell的标准符,如'n'。因此,我需要获取此输出并执行类似$output的操作。替换'n,抱歉没有足够快地理解它:/不幸的是,使用此方法我遇到错误:Send MailMessage:无法将'System.Object[]转换为参数'Body'所需的'System.String'类型。Określona metoda nie和obsługiwana开玩笑。-翻译的最后一句话:不支持指定的方法