首页 > 解决方案 > powershell 循环返回一些不正确的值,但不是全部

问题描述

我有一个针对目录运行并在其中查找文件的脚本。根据包含内部扩展名的文件名部分,它会将文件通过电子邮件发送给相关用户。我有 90% 的工作,它会通过电子邮件向正确的人发送正确的文件,但电子邮件主题行中的变量是错误的。例如,给 Bob 的文件发送给 Bob,但电子邮件主题行指示 Joe 以及 Joe 呼叫的 CallerID。

$Path = 'c:\test2'
$delim = '-'
$delim2 = '@'
$Port = "587"
$SMTPUsername = "voicemails@test.com"
$EncryptedPasswordFile = "c:\test\voicemails.com.securestring"
$SecureStringPassword = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString
$EmailCredential = New-Object -TypeName Management.Automation.PSCredential($SMTPUsername,$SecureStringPassword )
$DestFolder = 'C:\test2\Processed'
#phone extensions & associated email address
$extensions = @{
  '1000'= 'joe@test.com';
  '23' = 'bob@test.com';
  '765'= 'alice@test.com'
    }
$File = Get-ChildItem $Path -Name
$File | Foreach-object {
    $FirstName = $null
    $nameArray = $_.Split($delim)
    $newName = $nameArray[2]+" "+($nameArray[0].substring(0,8))
    $ext = $nameArray[3]
    $callerID = $nameArray[2]
    $Datestamp = ($nameArray[0].substring(0,8))
    $emailAddress = $extensions[$ext]
    $FirstNameArray = $emailAddress.Split($delim2)
    $FirstName = $FirstNameArray[0]
     $SMTPMessage = @{
        To = $emailAddress
        From = 'voicemails@test.com'
        Subject = $Subject
        Smtpserver = '192.168.1.9'
        }
    $SMTPBody = 'Voicemail redirected message'
    $Subject = "Call Recording on $Datestamp from ($CallerID) to $FirstName"
    Send-MailMessage -Credential $EmailCredential @SMTPMessage -Body $SMTPBody -Attachments $_ -Port $Port
}

我正在运行它的一些示例文件名:

我尝试将每个循环的值设置为 $null 但没有任何区别。

标签: .netpowershell

解决方案


这可能会发生,因为哈希表是在设置之前初始化$subject的。

$SMTPMessage = @{
    To = $emailAddress
    From = 'voicemails@test.com'
    Subject = $Subject # Uses old $subject
    Smtpserver = '192.168.1.9'
    }
# Set new subject
$Subject = "Call Recording on $Datestamp from ($CallerID) to $FirstName"

一个用于说明目的的简单示例:

$subject = "Subject 1"
$SMTPMessage = @{
    To = 'Rec 1'
    Subject = $subject
}
$SMTPMessage

$SMTPMessage = @{
    To = 'Rec 2'
    Subject = $subject
}
$subject = "Subject 2"
$SMTPMessage

Name                           Value
----                           -----
To                             Rec 1
Subject                        Subject 1
To                             Rec 2
Subject                        Subject 1 # Uses the value before reassignment

推荐阅读