Powershell - укажите коллекцию, которая не содержит нулевых значений. - PullRequest
0 голосов
/ 31 марта 2019

У меня есть скрипт 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

но письмо с вложением отлично работает, когда оно запускается.

1 Ответ

1 голос
/ 31 марта 2019

i наконец-то заметил, что ваш знак восклицания определен за до . Любое значение присваивается $ Attachment.[ blush ], что означает, что в слоте НЕ будет ничего в этом параметре.

the fix = переместить знак в стандартное местоположение - непосредственно перед вызовом, который его использует - и, следовательно, после присвоения всех $ Vars, которые он использует,[ ухмылка ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...