【问题标题】:Passing multiple strings as single function parameter将多个字符串作为单个函数参数传递
【发布时间】:2016-07-21 07:20:03
【问题描述】:

我正在尝试在 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,这也可以正常工作,所以问题在于将参​​数传递给函数。

【问题讨论】:

  • 我知道 PowerShell 1.0 方式但我不想使用它是什么意思。 是什么意思?
  • 您使用的是哪个版本的 PowerShell? Get-Host。我没有看到并在这里发布您的第二个示例,这对我有用。
  • 您在当前会话中是否有过$to 的强烈要求? $to.GetType().fullname
  • 啊哈.....那将是一个问题。它应该是system.object[]system.string[]。保存您的代码并使用新会话重新打开 ISE/PS。那它行得通吗?如果您强烈转换该变量,则以后如果不先删除它就无法更改它。 Remove-Variable to
  • 您在此之前的评论促使我做一个 rm variable:to 。刚刚重新运行代码并且它正在工作。非常感谢,因为从昨晚开始这一直困扰着我。呸!干杯。

标签: function powershell powershell-4.0


【解决方案1】:

您在此处列出的代码应该可以正常工作。 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】:

我这样发送它,它就像一个魅力。 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"

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不幸的是,这仍然不起作用。我应该提到我已经尝试过了。
    • 什么版本的powershell? Set-StrictMode 是否处于活动状态?您尝试过其他任何尝试吗?
    • 版本为 PowerShell 4.0 且严格模式处于活动状态
    • 在此上下文中,("user1@email.com", "user2@email.com").GetType().fullname@("user1@email.com", "user2@email.com").GetType().fullname 相同。 PowerShell 足够聪明,可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2023-03-26
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多