将多个字符串作为单个函数参数传递

时间:2016-04-01 13:02:24

标签: function powershell powershell-v4.0

我尝试在PowerShell中向多个收件人发送电子邮件。

我知道PowerShell 1.0方式,但我不想使用它。

我的电子邮件功能如下所示

function Send-Mail() {

    Param ( 
            # email attributes    
            [string]$smtpServer,
            [string]$from,
            [string[]]$to,
            [string]$subject,
            [string]$body
    )

    Send-MailMessage -To $to -Subject $subject -BodyAsHtml $body -SmtpServer $smtpServer -From $from 
}

我可以实现我想做的事情:

$smtpServer = "email.server.local"
$from = "sender@email.com"
$subject = "Subject"
$body = "Test"

Send-Mail $smtpServer $from ("user1@email.com", "user2@email.com") $subject $body

..但如果我把

$to = "user1@email.com", "user2@email.com"
Send-Mail $smtpServer $from $to $subject $body

邮件只发送给第二个收件人

如果我在函数中本地设置$to,这也可以正常工作,所以问题是将参数传递给函数。

3 个答案:

答案 0 :(得分:0)

$to = @("user1@email.com", "user2@email.com")会将$to设置为数组

答案 1 :(得分:0)

您在此处列出的代码应该运行得很好。 PowerShell在打字时非常宽容,它将为您提供最佳选择。但是,您可以将自己投射为[string],例如我怀疑您在托管之前在会话中的某个时刻做了什么。请考虑以下示例

PS C:\Users\matt> $to = "user1@email.com", "user2@email.com"

PS C:\Users\matt> $to.GetType().Fullname
System.Object[]

PS C:\Users\matt> [string]$to = "user1@email.com"

PS C:\Users\matt> $to.GetType().Fullname
System.String

PS C:\Users\matt> $to = "user1@email.com", "user2@email.com"

PS C:\Users\matt> $to.GetType().Fullname
System.String

请注意,在最后一个集合中,您可能期望System.Object[],但由于它在较早的行中被强烈转换为保持该类型,直到它被删除。

检查变量

时也可以看到这一点
PS C:\Users\mcameron> Get-Variable to | fl

Name        : to
.... output truncated ...
Attributes  : {System.Management.Automation.ArgumentTypeConverterAttribute}

这里的关键点是强大演员之后出现的属性System.Management.Automation.ArgumentTypeConverterAttribute。在会话期间或代码执行期间,您可以使用Remove-Variable to简单地删除变量,这样您就可以重新开始。

答案 2 :(得分:0)

我这样发了它就像一个魅力。 PS v4,Windows Server 2012

Send-MailMessage -To "firstemail@domain.com", "secondemail@domain2.com" -Body "TEST" -From "test@domain.com" -Subject "TEST" -SmtpServer smarthost.domain.com

为了您的功能目的,我会将电子邮件作为数组提交。这对我也有用。

$array = New-Object System.Collections.ArrayList
$array += "email1@domain1.com"
$array += "email2@domain2.com"
Send-MailMessage -To $array -Body "TEST" -From "test@domain.com" -Subject "TEST" -SmtpServer smarthost.domain.com

......最终,这对我来说很适合使用你的功能。

function Send-Mail() {
    Param ( 
        # email attributes    
        [string]$smtpServer,
        [string]$from,
        [string[]]$to,
        [string]$subject,
        [string]$body
    )
    Send-MailMessage -To $to -Subject $subject -BodyAsHtml $body -SmtpServer $smtpServer -From $from 
}
$array  = New-Object System.Collections.ArrayList
$array += "email1@domain1.com"
$array += "email2@domain2.com"
Send-Mail -smtpServer "smarthost.domain.com" `
          -from       "test@domain.com"      `
          -to         $array                 `
          -subject    "Test"                 `
          -body       "TEST"