【问题标题】:Cannot understand why this parameter is returning a null value无法理解为什么此参数返回空值
【发布时间】:2019-11-11 20:45:21
【问题描述】:

此 PowerShell 脚本运行 SQL 查询并填充 Excel 电子表格,然后通过电子邮件发送该电子表格:

$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"

$SqlQuery = @"
SELECT TOP 10 * FROM dbo.table
"@;

$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

$mailparam = @{
    To = $ToAddress
    From = $FromAddress
    Subject = $Subject
    Body = $Body
    Attachments = $Attachment
    SmtpServer = $SmtpServer
    Port = $SmtpPort
    Credential = $SmtpCred
}

Send-MailMessage @mailparam -UseSsl

我运行时遇到的错误是:

Send-MailMessage:无法验证参数“附件”上的参数。这 参数为空、空或参数集合的元素包含 空值。提供一个不包含任何空值的集合,然后 再次尝试该命令。 在 C:\Users\Desktop\Untitled1.ps1:58 char:18 + 发送邮件消息@mailparam -UseSsl + ~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessage

我无法弄清楚$Attachment 是如何以 null 或空的形式结束的?我知道我过去写过类似的脚本并且它们运行良好。我的脚本中是否缺少其他人可以看到的内容?此外,从技术上讲,我不需要先将 Excel 文件保存到文件系统,只需将其作为附件通过电子邮件发送即可。因此,如果答案消除了对文件系统部分的保存,那是可以的,如果这甚至可行的话。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    -Attachments 参数需要一个字符串或字符串列表。

    Send-MailMessage

    这应该是您需要附加的文件的完整路径,因此需要您先存储它们。一般来说,如果我以后不需要这些文件,你可以删除它们。另请注意,您必须通过FullName

    由于我看不到 Export-Excel 函数的输出,我假设它返回一个文件对象,那么这应该可以工作

    $mailparam = @{
        To = $ToAddress
        From = $FromAddress
        Subject = $Subject
        Body = $Body
        Attachments = $xlsFile.FullName
        SmtpServer = $SmtpServer
        Port = $SmtpPort
        Credential = $SmtpCred
    }
    

    如果没有返回 File 对象,则需要先获取项目并传递 `FullName'

    $MyExcelFile = Get-Item -Path 'C:\MyExcelFile.xlsx'
    
     $mailparam = @{
            To = $ToAddress
            From = $FromAddress
            Subject = $Subject
            Body = $Body
            Attachments = $MyExcelFile.FullName
            SmtpServer = $SmtpServer
            Port = $SmtpPort
            Credential = $SmtpCred
        }
    

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 2016-03-21
      • 2011-11-24
      • 1970-01-01
      • 2018-02-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多