2011-02-09 1 views
1

J'essaie d'utiliser Powershell pour sortir une table avec du contenu pre/post et l'envoyer par e-mail, mais le contenu pré/post apparaît dans l'e-mail en tant que "System.String []". Le reste du contenu semble correct, et si je publie la chaîne HTML dans la console, tout va bien.Convertto-HTML produisant du contenu pré/post apparaissant comme System.String [] au lieu du contenu réel

function Send-SMTPmail($to, $from, $subject, $smtpserver, $body) { 
    $mailer = new-object Net.Mail.SMTPclient($smtpserver) 
    $msg = new-object Net.Mail.MailMessage($from,$to,$subject,$body) 
    $msg.IsBodyHTML = $true 
    $mailer.send($msg) 
} 

$Content = get-process | Select ProcessName,Id 
$headerString = "<table><caption> Foo. </caption>" 
$footerString = "</table>" 
$MyReport = $Content | ConvertTo-Html -fragment -precontent $headerString -postcontent $footerString 

send-SMTPmail "my Email" "from email" "My Report Title" "My SMTP SERVER" $MyReport 

apparaît dans mon email:

System.String[] 
ProcessName Id 
...    ... 
System.String[] 

Faire un hors fichier, puis un Invoke-élément a les mêmes résultats que l'envoi de l'e-mail ...

Répondre

5

ConvertTo-Html retourne une liste d'objets - certains sont des chaînes et certains sont tableaux de chaînes, par exemple:

407# $headerString = "<table><caption> Foo. </caption>" 
408# $footerString = "</table>" 
409# $content = Get-Date | select Day, Month, Year 
410# $MyReport = $Content | ConvertTo-Html -Fragment -PreContent $headerString ` 
              -PostContent $footerString 
411# $MyReport | Foreach {$_.GetType().Name} 
String[] 
String 
String 
String 
String 
String 
String 
String 
String 
String 
String[] 

donc $ MyReport contient un tableau des deux chaînes et des tableaux de chaînes. Lorsque vous passez ce tableau au constructeur MailMessage, qui attend la chaîne de type, PowerShell tente de contraindre cela à une chaîne. Le résultat est:

412# "$MyReport" 
System.String[] <table> <colgroup> <col/> <col/> <col/> </colgroup> <tr><th>Day 
</th><th>Month</th><th>Year</th></tr> <tr><td>9</td><td>2</td><td>2011 
</td></tr> </table> System.String[] 

La solution facile est d'exécuter la sortie de ConverTo-Html par Out-String qui provoque $ MyReport être une seule chaîne:

413# $MyReport = $Content | ConvertTo-Html -Fragment -PreContent $headerString ` 
              -PostContent $footerString | 
          Out-String 
414# $MyReport | Foreach {$_.GetType().Name} 
String 
+0

Vous avez sauvé ma santé mentale. Out-String, FTW. – JakeRobinson

+0

si votre contenu est large, assurez-vous d'utiliser 'Out-String -Width ([int] :: MaxValue)' car la largeur de ligne par défaut de 'Out-String' est de 80 caractères. Il peut casser des lignes au milieu d'une balise HTML, brisant le balisage. –

0

convertto-html renvoie une liste de chaînes, pas une chaîne. Donc, je pense que $ myreport finit par être un tableau d'objets; par exemple, essayez ceci:

$Content = get-process | Select ProcessName,Id 
$headerString = "<table><caption> Foo. </caption>" 
$footerString = "</table>" 
$MyReport = $Content | ConvertTo-Html -fragment -precontent $headerString -postcontent $footerString 
get-member -input $MyReport 

force au lieu myreport de $ à être une chaîne avant de passer à envoyer-SMTPMail:

$MyReport = ($Content | ConvertTo-Html -fragment -precontent $headerString -postcontent $footerString) -join "`n"; 
+0

Je vois ce que vous voulez dire, mais qui n » ai pas t le réparer. – JakeRobinson

Questions connexes