web-dev-qa-db-ja.com

関数の必須パラメーターとデフォルトパラメーター

Fromとtoのアドレスが常に同じになるように、特別な目的(エラーメッセージ)のための小さなPowerShell send-email-functionを記述しました!

  Function Send-EMail {
      Param (
          [Parameter(Mandatory=$true)]  [String]$EmailTo   = "[email protected]", # default
          [Parameter(Mandatory=$true)]  [String]$EmailFrom = "[email protected]", #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デバッガーで行ごとに実行すると、EmailToアドレスを要求する小さなウィンドウが開きます。

Why this?

既に指定されているアドレスを要求されないようにするには、何を変更する必要がありますか?

7
gooly

Mandatoryパラメータ属性フラグ:

[Parameter(Mandatory=$true)]

「呼び出し元がこのパラメーターに引数を指定することは必須です」という意味です。

パラメータをparamブロックで指定したデフォルト値に戻す場合は、Mandatoryフラグを$falseに設定します。

[Parameter(Mandatory=$false)]
[string]$EmailTo = "[email protected]",

これは少し直感に反するように思えるかもしれませんが、ユーザーが必要なパラメーターを提供しなかったときにそれを検出できます。

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