1

スクリプトには、send-mailmessage コマンドレットをまとめて、各電子メールを送信する前に少しのロジックを実行する関数があります。

私の質問は、Cc、Bcc、および添付ファイルがオプションになるように、send-mailmessage にフィードする引数リストを作成する方法です。

私が以前に行ったことは、ほんの数個の if ステートメントです。しかし、ミックスに -Cc を追加すると、現在の 4 つの if ステートメントの代わりに 9 つの if ステートメントになります。

簡素化された機能:

Function Send-Email ($To, $Cc, $Bcc, $Subject, $From, $Body, $Attachments)
{
    #Some more code goes here that sometimes modifies the incoming parameters
    $EmailServer = my.mail.server
    Try
    {
        #Need to add ability for $Cc to be optional
        if ($Attachments -and $Bcc) {send-mailmessage -to $To -Cc $Cc -Bcc $Bcc -subject $Subject -From $From -body $Body -smtpserver $EmailServer -attachments $Attachments -ErrorAction "Stop"}
        if ($Attachments -and -not $Bcc) {send-mailmessage -to $To -Cc $Cc -subject $Subject -From $From -body $Body -smtpserver $EmailServer -attachments $Attachments -ErrorAction "Stop"}
        if ($Bcc -and -not $Attachments) {send-mailmessage -to $To -Cc $Cc -Bcc $Bcc -subject $Subject -From $From -body $Body -smtpserver $EmailServer -ErrorAction "Stop"}
        if (-not $Attachments -and -not $Bcc) {send-mailmessage -to $To -Cc $Cc -subject $Subject -From $From -body $Body -smtpserver $EmailServer -ErrorAction "Stop"}
    }
    Catch [system.exception]
    {
        "Failed to send email to $($To) due to: $_"  #Logging removed for SO example code
    }
    Finally
    {}
}

引数を 1 つの長い文字列または文字列の配列として生成してから、invoke-expression を使用してみました。同じことを試しましたが、「&」記号を使用してコマンドレットを実行しました。

試してみると、シェルからパラメーターの入力を求められます。

PS E:\script> invoke-expression 'send-mailmessage $a'

cmdlet Send-MailMessage at command pipeline position 1
Supply values for the following parameters:
From: 


PS E:\script> & send-mailmessage $a

cmdlet Send-MailMessage at command pipeline position 1
Supply values for the following parameters:
From: 

$Cc を $Null、$False、または null 文字列 "" に設定しようとしましたが、send-mailmessage が無効なパラメータを訴えます。

ここで単純なものが欠けているように感じますが、私の考えでは、関数は次の無効な例のようになります。

Function Send-Email ($To, $Cc, $Bcc, $Subject, $From, $Body, $Attachments)
{
    #Some more code goes here that sometimes modifies the incoming parameters
    $EmailServer = my.mail.server
    if ($Cc) {$CcArg = "-Cc $Cc"}
    if ($Bcc) {$BccArg = "-Bcc $Bcc"}
    if ($Attachments) {$AttachArg = "-Attachments $Attachments"}
    Try
    {
        send-mailmessage -to $To ($CcArg) ($BccArg) -subject $Subject -From $From -body $Body -smtpserver $EmailServer $AttachArg -ErrorAction "Stop"
    }
    Catch [system.exception]
    {
        "Failed to send email to $($To) due to: $_"  #Logging removed for SO example code
    }
    Finally
    {}
}

ご意見やご提案をありがとうございます。

4

2 に答える 2

2

あはは!この投稿を見つけました: cmdlet パラメーターとしての powershell 変数のインライン展開?

したがって、関数は次のようになります (完全にはテストされていませんが、原則は機能します)。

Function Send-Email ($To, $Cc, $Bcc, $Subject, $From, $Body, $Attachments)
{
    #Some more code goes here that sometimes modifies the incoming parameters
    $EmailServer = my.mail.server
    $MoreArgs = @{}
    if ($Cc) {$MoreArgs.Add("Cc",$Cc)}
    if ($Bcc) {$MoreArgs.Add("Bcc",$Bcc)}
    if ($Attachments) {$MoreArgs.Add("Attachments",$Attachments)}
    Try
    {
        send-mailmessage -to $To -subject $Subject -From $From -body $Body -smtpserver $EmailServer -ErrorAction "Stop" @MoreArgs
    }
    Catch [system.exception]
    {
        "Failed to send email to $($To) due to: $_"  #Logging removed for SO example code
    }
    Finally
    {}
}
于 2013-10-28T16:46:12.057 に答える