【问题标题】:Email Formatted Array电子邮件格式化数组
【发布时间】:2015-05-18 00:15:53
【问题描述】:

我有一个创建两个数组的脚本(每个数组有 1 列和可变行数)。我想格式化这两个数组并将其通过电子邮件发送到 Outlook 帐户。下面的代码和示例数据。

$Values2 = @(Get-Content *\IdealOutput.csv) 

$OutputLookUp2 = @()
foreach ($Value in $Values2) {
    $OutputLookUp2 += $Excel.WorksheetFunction.VLookup($Value,$range4,3,$false)
}

$Excel.Workbooks.Close()
$Excel.Quit()

$EmailFrom = "sample@sample.com"  
$EmailTo = "sample@sample.com"
$EmailBody = "$Values2 $OutputLookup2" 
$EmailSubject = "Test"
$Username = "sample"
$Password = "sample"

$Message = New-Object Net.Mail.MailMessage `
    ($EmailFrom, $EmailTo, $EmailSubject, $EmailBody)
$SMTPClient = New-Object Net.Mail.SmtpClient `
    ("smtp.outlook.com", portnumber) #Port can be changed
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential `
    ($Username, $Password);
$SMTPClient.Send($Message)

$OutputLookUp2$Values2 都是一列,行数可变。

例子:

$Outputlookup2 = 
X1 
X2

$Values2 = 
Y1 
Y2

我希望电子邮件正文的输出为:

X1 Y1
X2 Y2

我想避免使用 HTML,因为它也会通过文本发送。

【问题讨论】:

    标签: arrays email powershell


    【解决方案1】:

    假设我的解释是正确的,这似乎很简单。对于每个$Values2,它只是文本文件中的一行,在打开的电子表格中找到它的相似值。你有你需要的循环。问题是您正在构建彼此独立的项目列表。

    $Values2 = @(Get-Content *\IdealOutput.csv) 
    
    $OutputLookUp2 = @()
    foreach ($Value in $Values2){
        $OutputLookUp2 += "$Value $($Excel.WorksheetFunction.VLookup($Value,$range4,3,$false))"
    }
    

    现在$OutputLookUp2 应该包含您预期的数组形式的输出。

    如果数组不起作用,您也可以将其声明为字符串并在构建时添加换行符。您会注意到字符串末尾的"`r`n"

    $Values2 = @(Get-Content *\IdealOutput.csv) 
    
    $OutputLookUp2 = ""
    foreach ($Value in $Values2){
        $OutputLookUp2 += "$Value $($Excel.WorksheetFunction.VLookup($Value,$range4,3,$false))`r`n"
    }
    

    在这两个示例中,您只需颠倒$value 的顺序即可轻松查找。如果您需要标头,可以在声明 $OutputLookUp2 时添加。

    总是有改进的余地

    如果您想朝着Ansgar Wiechers 所逃避的方向更进一步……

    $OutputLookUp2 = Get-Content *\IdealOutput.csv | ForEach-Object{
        "$_ $($Excel.WorksheetFunction.VLookup($_,$range4,3,$false))"
    } | Out-String
    

    【讨论】:

    • 在循环中附加到数组的性能很差,应该避免。此外,MailMessage 期望正文为字符串,而不是字符串数组,因此您可能需要在第一个示例中添加 Out-String
    • 试图在不进行大刀阔斧的改变的情况下调整他的代码。使用管道将是优先且可以实现的,这是您的观点@AnsgarWiechers?
    • @AnsgarWiechers 我不确定我的更新是否更好或您的意思。如果您有任何反馈,将不胜感激。
    • 是的,我认为管道是更优雅的方法。你可以像这样简化它:$output = gc input.csv | % { '{0} {1}' -f $_, $Excel.WorksheetFunction.VLookup($_, $range4, 3, $false) } | Out-String
    • @AnsgarWiechers 我最初考虑了格式运算符,但由于 OP 遇到的特定问题而决定反对它。试图保持简单。让他放心。 | Out-String 肯定比 -join "`r`n" 容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2019-09-01
    • 2011-06-02
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多