2015-12-17 14 views
1

非常基本的问题,我很抱歉,但我确信我之前没有这个。我想知道如何从foreach内部访问变量。例如在这个简单的代码中,它只是回声$用户名,但不是我以后的确切名称......但是如果您将回声$user看起来像它可以读取foreach和csv。调用已在foreach中设置的变量 - powershell

add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010 

$ExSession = New-PSSession –ConfigurationName Microsoft.Exchange –ConnectionUri http://dlonsexh05.server.local/PowerShell/ –Authentication Kerberos 

import-PSSession $Exsession -AllowClobber 

$users= import-csv 'C:\Surface Pro\users.csv' 

foreach ($user in $users){ 

$duedate = $user.DueDate 
$Username = $user.Name 
$email = $user.EmailAddress 


$smtpServer = "dlonsexh05.server.local" 
$smtpFrom = "[email protected]" 
$smtpTo = $email 
$messageSubject = "$username your laptop is due back on $duedate" 
$SMTPPort = "587" 



$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto 
$message.Subject = $messageSubject 

$smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($message) 
Remove-PSSession $Exsession 

break 

} 

回答

1

现在,你通过一切循环和然后显示$username,所以你总是会显示最后一个。

如果移动echo到内循环,你会显示所有的人:

$users= import-csv 'C:\Surface Pro\users.csv' 
foreach ($user in $users){ 
    $username = $user.Name 
    echo $username 
} 

如果你想具体的一个,你需要编写代码对其进行过滤,所以地方使用if声明,或用Where-Object过滤;这取决于你想要做什么。

+0

谢谢briantist。我想在CSV中声明一些变量,然后再使用它们。例如$ email = $ User.email ...然后在循环外面,我想在一个函数或类似的东西中使用它来发送一封电子邮件给csv的email列中的每个人。我是否必须将所有SMTP代码放入循环中? –

+0

@DanielGripton很好,是的。每个循环迭代都会为您提供一行CSV,因此您要针对每个row_运行的代码应位于循环内部。 – briantist

+0

好吧,这很棘手!我把代码放在里面,它发送电子邮件到CSV中的每个电子邮件地址,但发送了大约5个空白邮件。如果我休息一下,它只会发送到最上面的一个。我希望它能够处理CSV,然后在完成所有电子邮件地址后停止。继承人的代码! –