函数的强制和默认参数

27

我为特定目的(错误消息)编写了一个小型PowerShell发送电子邮件函数,以便发件人和收件人地址始终相同!

  Function Send-EMail {
      Param (
          [Parameter(Mandatory=$true)]  [String]$EmailTo   = "ToAddr@gmx.at", # default
          [Parameter(Mandatory=$true)]  [String]$EmailFrom = "FromAddr@gmail.com", #default
          [Parameter(Mandatory=$true)]  [String]$Subject,
          [Parameter(Mandatory=$true)]  [String]$Body,
          [Parameter(mandatory=$false)] [String]$Attachment,
          [Parameter(mandatory=$true)]  [String]$Password
      )
          $SMTPServer = "smtp.gmail.com"
          $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
          if ($attachment -ne $null) {
              $SMTPattachment = New-Object System.Net.Mail.Attachment($attachment)
              $SMTPMessage.Attachments.Add($STMPattachment)
          }
          $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
          $SMTPClient.EnableSsl = $true
          $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom.Split("@")[0], $Password);
          $SMTPClient.Send($SMTPMessage)
          Remove-Variable -Name SMTPMessage
          Remove-Variable -Name SMTPClient
          Remove-Variable -Name Password
          Remove-Variable -Name Body
          Remove-Variable -Name Subject

  } #End Function Send-EMail
  ....
  $subj = "Subject"
  $body = @" Body-Text  "@
  Send-EMail -Subject $subj -Body $body -Password "myPWD" -Attachment $logFile

我希望现在无需再次指定电子邮件地址,但是如果在ISE调试器中逐行运行它,会弹出一个小窗口要求我输入电子邮件地址:

为什么?

我需要更改什么以免被要求再次输入已经给出的地址?


3
$EmailTo$EmailFrom[Parameter(Mandatory=$true)] 改为 [Parameter(Mandatory=$false)] - 如果始终需要用户输入参数,则不能默认任何值。 - Mathias R. Jessen
好的,谢谢,它可以工作 - 即使逻辑有点奇怪。 - gooly
1个回答

53

Mandatory参数属性标记:

[Parameter(Mandatory=$true)]

真正的意思是“调用者必须为此参数提供一个参数”。

如果您希望参数返回到您在param块中提供的默认值,请将 Mandatory 标志设置为 $false

[Parameter(Mandatory=$false)]
[string]$EmailTo = "to@company.domain",
这可能看起来有些违反直觉,但它允许您检测到用户没有提供所需的参数:

这可能听起来有些不合情理,但它可以让您检测到用户未提供所需的参数:

if(-not($PSBoundParameters.ContainsKey('EmailTo')) -and $EmailTo)
{
    # User relied on default value
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接