【问题标题】:Powershell Send-MailMessage foreach different values in csvPowershell Send-MailMessage foreach csv中的不同值
【发布时间】:2020-01-30 01:11:02
【问题描述】:

致各位

我有一个 csv,其中每一行都有一个承包商 samaccount、其帐户到期日期、承包商的主管姓名和各自的电子邮件地址。

我的 csv 中有以下数据:

Name,AccountExpirationDate,Submitter,SubmitterEmail
Username1,9/21/2019,Submitter1,Submitter1@b.com
Username2,9/22/2019,Submitter2,Submitter2@b.com
Username3,9/23/2019,Submitter3,Submitter3@b.com

当我执行下面的代码时,它确实会为每一行发送一封电子邮件,但该消息仅说明每封电子邮件中的 username3 数据。如何更正此问题,以便 submitter1@b.com 接收 username1 数据,提交者 2 接收 username2 数据等?

$from    =  "Your Friends in IT <a@b.c>"
$subject =  "Your contractors's login account will expire soon!"
$body    =  "Hello <br>"
$body    +=  "Your contractor's login account for <b>$Name</b></font> is set to expire on<b> $AccountExpirationDate</b>.<br>"
$body    +=  "Kind Regards,<br><br>"
$body    +=  "Your friends in IT"       
$csv = Import-Csv -Path "C:\ps\SAC-Accounts-ExpiringSoon.csv"
$csv | foreach {
  $Name = $_.name
  $to = $_.SACSubmitterEmail
  $_.AccountExpirationDate = $_.AccountExpirationDate -as [datetime]
  $_
      }
ForEach ($user in $csv)
{
$mail = New-Object System.Net.Mail.Mailmessage $from, $to, $subject, $body
$mail.IsBodyHTML=$true
$server = "mail.b.com"
# $port   = 25
$Smtp = New-Object System.Net.Mail.SMTPClient $server,$port
$Smtp.Credentials = [system.Net.CredentialCache]::DefaultNetworkCredentials
$smtp.send($mail)
}

【问题讨论】:

  • $csv | foreach {} 如果您之后已经有一个迭代相同数据的 foreach 循环,则不需要。将您的努力组合成一个循环可能会解决大多数问题。由于除了设置变量之外您没有对foreach-object 执行任何操作,因此当您到达下一个循环时,您只有前一个foreach-object 设置的最后一个值。您的意图似乎是同时循环两次,但它没有那种效果。
  • 此外,变量名称存在一些问题:脚本或 CSV 列中未提及 $_.SACSubmitterEmail。您可以通过更改以下行来解决所述问题:$mail = New-Object System.Net.Mail.Mailmessage $from, $to, $subject, $body$mail = New-Object System.Net.Mail.Mailmessage $from, $user.SubmitterEmail, $subject, $body

标签: powershell csv foreach


【解决方案1】:

问题的根本原因是有一个循环在第一个循环的每次迭代上设置下一个循环所需的变量,但下一个循环永远不会得到它们直到第一个循环完成。在此示例中,最好将两个循环的工作组合到一个循环中。您可以使用Foreach-Objectforeach

$from    =  "Your Friends in IT <a@b.c>"
$subject =  "Your contractors's login account will expire soon!"      
$csv = Import-Csv -Path "C:\ps\SAC-Accounts-ExpiringSoon.csv"

ForEach ($user in $csv)
{
    $Name = $user.Name
    $to = $user.SubmitterEmail
    $AccountExpirationDate = $user.AccountExpirationDate -as [datetime]
    $body =  "Hello <br>"
    $body +=  "Your contractor's login account for <b>$Name</b></font> is set to expire on<b> $AccountExpirationDate</b>.<br>"
    $body +=  "Kind Regards,<br><br>"
    $body +=  "Your friends in IT"

    $mail = New-Object System.Net.Mail.Mailmessage $from, $to, $subject, $body
    $mail.IsBodyHTML=$true
    $server = "mail.b.com"
    # $port   = 25
    $Smtp = New-Object System.Net.Mail.SMTPClient $server,$port
    $Smtp.Credentials = [system.Net.CredentialCache]::DefaultNetworkCredentials
    $smtp.send($mail)
}

PowerShell 不会提前读取您的代码并确定变量值是什么。必须在 PowerShell 需要检索该值之前对其进行分配和定义。根据您的代码的构造方式,$body 期望 $name$AccountExpirationDate 已经被分配。

【讨论】:

  • 这太有道理了!非常感谢。
猜你喜欢
  • 2019-06-05
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多