如何将Export-CSV链接到Send-MailMessage而无需在PowerShell中将CSV保存到磁盘?

时间:2012-11-30 16:06:28

标签: powershell powershell-v3.0

我想将AD用户列表通过电子邮件发送给我,但我不想在发送电子邮件之前将CSV保存到磁盘。

以下是获取数据的代码:

get-aduser -filter * -properties Telephonenumber |
where Telephonenumber -ne $Null | 
select givenname, surname, telephonenumber | 
sort surname

现在我想添加类似的内容:

| Export-Csv | 
Send-MailMessage -From HelpDesk@company.com -to someone@company.com -subject "Outlook address book export" -SmtpServer EdgeTransport

是否有将CSV数据作为附件添加到内存而不将文件保存到文件系统?

4 个答案:

答案 0 :(得分:3)

上面提出/接受的答案不正确,不起作用。 Send-MailMessage的-Body参数需要一个字符串对象(System.String)。示例中创建的$ mydata对象是System.array对象。如果您按上面所示使用它,命令将失败。

您可以做的是创建一个文件,用CSV数据填充它,将其作为附件发送,然后将其删除。

使用上面的代码,例如:

$attachment = New-Item filename.csv -ItemType file
get-aduser -filter * -properties Telephonenumber | where Telephonenumber -ne $Null | select givenname, surname, telephonenumber | sort surname | Export-Csv $attachment -NoTypeInformation
Send-MailMessage -Attachments $attachment -Body $SmtpBodyTrue -BodyAsHtml -From $SmtpSender -To $MailTo -Subject $SmtpSubject -SmtpServer $SmtpServer
Remove-Item $attachment
$attachment = $null

答案 1 :(得分:2)

-Attachments的{​​{1}}参数需要一个路径数组,因此您必须在某处将文件写入磁盘。

要将CSV数据作为电子邮件正文发送,请使用Send-MailMessage代替convertto-csv -notypeinformation

export-csv

答案 2 :(得分:2)

我知道这是一个超级老线程,但上面的答案不再正确。您可以将内存中的对象作为附件发送,而无需先写入文件。您需要使用.net方法,但它运行良好。

关键是.net方法[System.Net.Mail.Attachment] :: CreateAttachmentFromString

http://geekswithblogs.net/mkoerner/archive/2012/01/19/powershell-emailing-strings-as-attachments.aspx

答案 3 :(得分:0)

我知道这是一篇很老的文章,但我想我会在担任类似职务后再发表意见。

下面是我编写的用于从对象等创建CSV附件的基本功能。

使此功能正常工作的主要问题之一是首先[enclosures]用引号将所有内容输出(我知道这已修复为PS6 +,但在使用PS5时没有用。其次,将CSV数据转换为字符串时)并将其转换为转义转义的换行的内存流,为了解决这个问题,我在CSV的每一行中附加了[@attributes]

table = dynamodb_client.describe_table(TableName="table_name")

attrs = []
keys = []

for k in table['Table']['KeySchema']:
    keys.append(k['AttributeName'])

for attr in table['Table']['AttributeDefinitions']:
    if attr['AttributeName'] in keys:
        attrs.append(attr)


dynamodb_client.create_table(
    KeySchema=table['Table']['KeySchema'],
    AttributeDefinitions=attrs,
    other-options-here)

要使用此功能,您需要准备好对象,因为它们没有考虑管道功能(如我所说的基本功能)。

示例:

convertto-csv

[System.Environment]::NewLine要求字符串到文件路径起作用的意义上来说,答案之一是正确的。

但是,您可以使用.net库Function ConvertTo-CSVEmailAttachment { Param( [Parameter(Mandatory=$true)] [String]$FileName, [Parameter(Mandatory=$true)] [Object]$PSObject, $Delimiter ) If ($Delimiter -eq $null){$Delimiter = ","} $MS = [System.IO.MemoryStream]::new() $SW = [System.IO.StreamWriter]::new($MS) $SW.Write([String]($PSObject | convertto-csv -NoTypeInformation -Delimiter $Delimiter | % {($_).replace('"','') + [System.Environment]::NewLine})) $SW.Flush() $MS.Seek(0,"Begin") | Out-Null $CT = [System.Net.Mime.ContentType]::new() $CT.MediaType = "text/csv" Return [System.Net.Mail.Attachment]::new($MS,$FileName,$CT) } 来创建电子邮件,而不是使用 $ADList = get-aduser -filter * -properties Telephonenumber | where Telephonenumber -ne $Null | select givenname, surname, telephonenumber |sort surname $EmailAttachment = ConvertTo-CSVEmailAttachment -FileName "ADList.CSV" -PSObject $ADList

Send-MailMessage

无论如何,我希望这对将来处于类似情况的人有所帮助。