背景
我有cmdlet Send-MailMessage,它使用动态生成的HTML文件作为正文,使用XML文件作为所有其他配置。
XML文件如下所示:
<root> ... <Emails> <Email id="statsEmail" SMTPSvr="mailrelay@domain.com"> <config> <from>lab@domain.com</from> <to>techgroup@domain.com</to> <to>techgroup1@domain.com</to> <cc>iWantItToo@domain.com</cc> <bcc>manager@domain.com</bcc> <subject>Statistics</subject> </config> </Email> ... </Emails> </root>
如果我用Powershell这样调用它: $ config = $ configXML.selectNodes(“// Email [@ id =”statsEmail“]”)
Send-MailMessage -SmtpServer $config.SMTPSvr `
-From $config.From `
-To $config.To -Cc $config.Cc -Bcc $config.Bcc `
-Subject $config.Subject `
-Attachments $attachArray `
-BodyAsHtml "$SCRIPT:htmlBody"
它运作得很好..
问题
如果经理然后决定他不再想要被BCC,我只是从配置文件中删除BCC元素吧?错误,Powershell(非常正确)抛出错误,因为我指定了BCC参数,$ config.bcc大约为$ null。
这是错误(只是有人问):
Send-MailMessage:无法验证参数'Cc'的参数。参数为null或空。提供一个非null或空的参数,然后再次尝试该命令 + CategoryInfo:InvalidData:(:) [Send-MailMessage],ParameterBindingValidationException
结束
我意识到我可以通过将Send-MailMessage置于嵌套中来解决这个问题,我只是好奇是否有更清晰的解决方案来添加/删除Cc&amp; Bcc动态参考。
答案 0 :(得分:15)
创建一个哈希表,其中包含要发送到cmdlet的所有参数和值,然后“splat”。这将使您能够以编程方式控制发送的参数和值,并以易于阅读(适用于人类)的格式显示它们,如下例所示:
# Define the parameters and values to give to Send-MailMessage.
$parameters = @{
From = $config.From
...
To = $config.To
}
# Check if $config.BCC is null. If it isn't, add it to the hashtable.
if ($null -ne $config.Bcc) {
$parameters.Add("BCC", $config.Bcc)
}
# Call Send-MailMessage with all of our prepared parameters.
Send-MailMessage @parameters