2016-04-01 2 views
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 = "[email protected]" 
$subject = "Subject" 
$body = "Test" 

Send-Mail $smtpServer $from ("[email protected]", "[email protected]") $subject $body 

.. если я ставлю

$to = "[email protected]", "[email protected]" 
Send-Mail $smtpServer $from $to $subject $body 

почты идет только второй получатель

Если я устанавливаю $to локально в функции, это также работает правильно, поэтому проблема заключается в передаче параметра функции.

+0

Что такое _I знаю о PowerShell 1.0, но я не хочу его использовать. – Matt

+0

Какую версию PowerShell вы используете? 'Get-Host'. Я не вижу и не говорю здесь со вторым примером, и это работает на меня. – Matt

+0

@Paul Это не работает. $ хочет массив строк, который он будет разворачивать. При использовании унарного оператора он преобразует его в строку с разделителями пробелов .... если вы не измените тип параметра функции. – Matt

ответ

0

Я отправил его вот так, и он работал как шарм. PS v4, Windows Server 2012

Send-MailMessage -To "[email protected]", "[email protected]" -Body "TEST" -From "[email protected]" -Subject "TEST" -SmtpServer smarthost.domain.com 

для ваших функций, я бы отправил электронные письма в виде массива. Это также сработало для меня.

$array = New-Object System.Collections.ArrayList 
$array += "[email protected]" 
$array += "[email protected]" 
Send-MailMessage -To $array -Body "TEST" -From "[email protected]" -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 += "[email protected]" 
$array += "[email protected]" 
Send-Mail -smtpServer "smarthost.domain.com" ` 
      -from  "[email protected]"  ` 
      -to   $array     ` 
      -subject "Test"     ` 
      -body  "TEST" 
0

$to = @("[email protected]", "[email protected]") установит $to быть массивом

+0

Это все еще не работает. Я должен был упомянуть, что я это пробовал. – ATtheincredibleaf

+0

Какая версия powershell? Включен ли Set-StrictMode? Любые другие попытки, которые вы пробовали? –

+0

Версия PowerShell 4.0 и Strict Mode активна – ATtheincredibleaf

0

код вы перечислили здесь должны работали просто отлично. PowerShell довольно прощает, когда дело доходит до ввода текста, и это сделает лучший выбор для вас. Тем не менее, вы можете использовать себя как [string], например, который, как я подозреваю, сделал в какой-то момент вашей сессии перед тем, как вы разместили. Рассмотрим следующие примеры

PS C:\Users\matt> $to = "[email protected]", "[email protected]" 

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

PS C:\Users\matt> [string]$to = "[email protected]" 

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

PS C:\Users\matt> $to = "[email protected]", "[email protected]" 

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, которая позволит вам начать все заново.

+0

Спасибо за приведенное выше объяснение. Было бы более полезно, если бы вы поместили консольный вывод под ваши входы в начальный раздел, чтобы было легче следовать EDIT: просто видел, что вы это сделали, но подсветка сбивает с толку вещи (по крайней мере для меня). Благодарю. – ATtheincredibleaf

Смежные вопросы