Разрешить параметру принимать пустую или пустую строку PowerShell

В этом методе я добавил параметр $blindcopy, который я хочу, чтобы пользователи bcc могли при вызове. После тестирования этого скрипта без добавления этого параметра все хорошо. После добавления этого дополнения я получаю сообщение об ошибке "Невозможно проверить аргумент параметра" bcc ". Аргумент нулевой или пустой". Я попытался добавить атрибут AllowEmptyString() к параметру, но все еще не получилось. Любая помощь высоко ценится!

cls

$BccNull = ""

function SendEmail([string]$BodyString,[string]$SubjectString,[string[]]$EmailRecipientsArray,[string]$FileAttachment=$null,[AllowEmptyString()][string]$BlindCopy)
{ 
    $MethodName = "Send Email"

    # Send the HTML Based Email using the information from the tables I have gathered information in
    try
    {       
        $user = "user@foo.com"
        $pass = ConvertTo-SecureString -String "bar" -AsPlainText -Force
        $cred = New-Object System.Management.Automation.PSCredential $user, $pass

        $SMTPServer = "some.mail.server"
        if([string]::IsNullOrEmpty($BodyString))
        {
            $BodyString = " Body text was empty for user:  $ErrorMessageUserName"
        }


        if([string]::IsNullOrEmpty($FileAttachment)) 
        {
            Send-MailMessage -From "foo@bar.org" -To "bar@foo.org" -Subject $SubjectString -Bcc $BlindCopy -Body $BodyString -BodyAsHtml -Priority High -dno onSuccess, onFailure -SmtpServer $SMTPServer -Credential $cred
        }
        else
        {
            Send-MailMessage -From "foo@bar.org" -To "bar@foo.org" -Subject $SubjectString -Body $BodyString -BodyAsHtml -Attachments $FileAttachment -Priority High -dno onSuccess, onFailure -SmtpServer $SMTPServer -Credential $cred
        }   
    }
    catch
    {
        Write-Host "An Exception has occurred:" -ForegroundColor Red
        Write-Host "Exception Type: $($_.Exception.GetType().FullName)" -ForegroundColor Red
        Write-Host "Exception Message: $($_.Exception.Message)" -ForegroundColor Red 

        #$ErrorMessage =  "Script Error: "+ $_.Exception.Message + "`n" + "Exception Type: $($_.Exception.GetType().FullName)"
        #$SubjectLine = "Script Error:  " + $MethodName + " " + $ErrorMessageUserName

        #SendEmail -BodyString $ErrorMessage -SubjectString $SubjectLine -EmailRecipientsArray $EmailErrorAddress -FileAttachment $null

        $SuccessfulRun = $false
        #ReturnStatusError -CurrentStatus "Error" -ErrorMessage $_.Exception.Message
    }
}

SendEmail -BodyString "Test" -SubjectString "Test" -EmailRecipientArray "foo@bar.org" -FileAttachment $null -BlindCopy $BccNull

1 ответ

Решение

Даже если -BlindCopy параметр вашей функции принимает пустую строку, -Bcc параметр Send-MailMessage до сих пор нет.

Я бы сказал, что лучшим вариантом для вас будет создание хеш-таблицы ваших параметров, добавление необязательных параметров, если они не пустые, а затем добавление хеш-таблицы в командлет.

function Send-Email {
    Param(
        [Parameter(Mandatory=$true)]
        [string]$BodyString,

        [Parameter(Mandatory=$true)]
        [string]$SubjectString,

        [Parameter(Mandatory=$true)]
        [string[]]$EmailRecipientsArray,

        [Parameter(Mandatory=$false)]
        [string]$FileAttachment = '',

        [Parameter(Mandatory=$false)]
        [AllowEmptyString()]
        [string]$BlindCopy = ''
    )

    try {
        $user = "user@foo.com"
        $pass = ConvertTo-SecureString -String "bar" -AsPlainText -Force
        $cred = New-Object Management.Automation.PSCredential $user, $pass

        $params = @{
            'From'       = 'foo@bar.org'
            'To'         = 'bar@foo.org'
            'Subject'    = $SubjectString
            'Body'       = $BodyString
            'Priority'   = 'High'
            'dno'        = 'onSuccess', 'onFailure'
            'SmtpServer' = 'some.mail.server'
            'Credential' = $cred
        }

        if ($BlindCopy)     { $params['Bcc'] = $BlindCopy }
        if($FileAttachment) { $params['Attachments'] = $FileAttachment }

        Send-MailMessage @params -BodyAsHtml
    } catch {
        ...
    }
}

Но даже со сплаттингом я, вероятно, все еще не позволю пустые строки для параметра -BlindCopy, Если сообщение не предназначено для кого-то BCC, этот параметр следует полностью пропустить. То же самое касается вложений. Если пустая строка отображается как получатель BCC (или вложение), функция должна выдать ошибку. ПО МОЕМУ МНЕНИЮ. YMMV.

Другие вопросы по тегам