У меня есть скрипт Powershell, который запускает запрос SQL Server, экспортирует его в файл Excel, а затем должен отправить этот файл Excel по электронной почте в виде вложения. Экспортер Excel, который я использую, отсюда: https://github.com/dfinke/ImportExcel
Вот скрипт:
##--Variables Start
$FileName = "C:\Users\user\Documents\Report.xlsx";
$ConnectionString = "OurConnectionString"
$secpasswd = "emailpassword"
$cred = New-Object System.Management.Automation.PSCredential ("emailaddress", $secpasswd)
$SmtpCred = $cred
$ToAddress = 'to@contoso.com'
$FromAddress = 'from@contoso.com'
$SmtpServer = 'smtp.server.com'
$SmtpPort = '587'
$Subject = 'Report'
$Body = "Here is your report"
$mailparam = @{
To = $ToAddress
From = $FromAddress
Subject = $Subject
Body = $Body
Attachments = $Attachment
SmtpServer = $SmtpServer
Port = $SmtpPort
Credential = $SmtpCred
}
$SqlQuery = @"
SELECT TOP 10 * FROM dbo.table
"@;
##--Variables End
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
$SqlConnection.ConnectionString = $ConnectionString;
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $SqlQuery;
$SqlCmd.Connection = $SqlConnection;
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlAdapter.SelectCommand = $SqlCmd;
$DataSet = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet);
$DataSetTable = $DataSet.Tables["Table"];
$xlsFile = @($DataSetTable | Export-Excel $FileName -AutoSize)
$SqlConnection.Close()
$Attachment = $xlsFile
Send-MailMessage @mailparam -UseSsl
После запуска вышеуказанного сценария файл Excel правильно экспортируется, но отправка почты завершается сбоем из-за предполагаемого нулевого значения в переменной $Attachment
- я получаю следующую ошибку:
Send-MailMessage: Невозможно проверить аргумент в параметре «Вложения». Аргумент нулевой, пустой или элемент коллекции аргументов содержит нулевое значение. Предоставить коллекцию, которая
не содержит нулевых значений, а затем повторите команду.
В C: \ Users \ Desktop \ Untitled1.ps1: 58 char: 18
+ Send-MailMessage @mailparam -UseSsl
+ ~~~~~~~~~~
+ CategoryInfo: InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException
+ FullyQualifiedErrorId: ParameterArgumentValidationError, Microsoft.PowerShell.Commands.SendMailMessage
Что не так с моим синтаксисом, когда переменная $Attachment
пуста?
У меня есть другой сценарий, который почти идентичен этому, но вместо использования $xlsFile = @($DataSetTable | Export-Excel $FileName -AutoSize)
для экспорта в Excel он использует более старый PowerShell ComObject с гораздо большим кодом для выполнения части Excel - этот другой сценарий также заканчивается на:
$Attachment = $xlsFile
Send-MailMessage @mailparam -UseSsl
но письмо с вложением отлично работает, когда оно запускается.