比较两个不同的csv文件&发送电子邮件

时间:2017-05-10 21:59:09

标签: powershell csv email

我有两个我要比较的csv文件。

第一个有两个标题(ComputerName,IsOnLine)

第二个有两个标题(ComputerName,Contact)

我想比较“ComputerName”,如果它们在两个文件中,那么我需要向该计算机的联系人发送电子邮件。

“联系人”拥有该计算机的电子邮件地址

所以1.csv

ComputerName IsOnLine

PC1离线

2.csv

ComputerName联系

PC1 contact@company.com

PC2 Different@company.com

我需要向PC1的联系人发送电子邮件。

    $Contacts = Import-Csv -Path "C:\Remote_Contacts.csv"
    $NExport = Import-Csv -Path "C:\Offline-computers_$(get-date -formt `"yyyy_MM_dd_HH`").csv"
    #Not really getting what I want here
    Compare-Object $NExport $Contacts  -Property ComputerName -IncludeEqual -PassThru

我已经在其他PowerShell脚本中发送了电子邮件,但我需要能够从2.csv中提取它并将其添加到电子邮件代码中。

3 个答案:

答案 0 :(得分:2)

为了使其更容易理解,我将简单地遍历第一个列表并过滤第二个列表以获取所需信息。如果你没有超过数千台计算机,这将有效。

$Contacts = Import-Csv -Path "C:\Remote_Contacts.csv"
$NExport = Import-Csv -Path "C:\Offline-computers_$(get-date -format "yyyy_MM_dd_HH").csv"

foreach ($PCStatus in $NExport) {
    if ($PCStatus.ComputerName -in ($Contacts.ComputerName)) {
        $ContactDetails = $Contacts | Where-Object Computername -eq ($PCStatus.ComputerName)
        $Subject = ($PCStatus.Computername) + ' is ' + ($PCStatus.IsOnline)
        Send-MailMessage -Subject $Subject -To ($ContactDetails.Contact) -SmtpServer smtp.example.com
    }
}

说明: 我们通过我们拥有状态的每台计算机。 我们检查是否有联系方式,如果没有,我们什么都不做。 如果我们有联系方式,我们会发送消息。

答案 1 :(得分:1)

$csv1 | where-object { $_.computername -in $csv2.computername }这样的东西应该可以工作

    PS C:\bjm\pwrshl> get-content .\csv1.csv
    computername,contact
    computer1,me@mysite.com
    computer2,you@yoursite.com
    computer3,them@theirsite.com
    PS C:\bjm\pwrshl> get-content .\csv2.csv
    computername,status
    computer1,up
    computer3,down
    computer22,up
    PS C:\bjm\pwrshl> $csv1 = Import-Csv .\csv1.csv
    PS C:\bjm\pwrshl> $csv2 = import-csv .\csv2.csv
    PS C:\bjm\pwrshl> $csv1 | where-object { $_.computername -in $csv2.computername }

    computername contact
    ------------ -------
    computer1    me@mysite.com
    computer3    them@theirsite.com

如果您在使用PowerShell发送电子邮件时需要帮助,则应该询问具体问题(例如,您遇到的问题)。

答案 2 :(得分:0)

如果我们直接比较两个变量的属性然后过滤等于比较==,那么你应该有一个可以循环的列表。

在循环过程中,您可以过滤联系人CSV以获取您需要联系的电子邮件:

$Contacts = Import-Csv -Path "C:\Remote_Contacts.csv"
$NExport = Import-Csv -Path "C:\Offline-computers_$(get-date -formt 'yyyy_MM_dd_HH').csv"

# Compare the ComputerName property on both CSV variables
$comparison = Compare-Object -ReferenceObject $Contacts.ComputerName -DifferenceObject $NExport.ComputerName -IncludeEqual

# Filter the comparison to get all the ComputerNames that were equal
$equalComparison = $comparison | Where-Object -FilterScript { $_.SideIndicator -eq '==' } | Select-Object -ExpandProperty InputObject

# Loop through each computer
foreach($computer in $equalComparison)
{
    # Get the contact details for this computer
    $computerContact = $contacts | Where-Object -FilterScript { $_.ComputerName -eq $computer }

    # $computer is the name of the computer that appears in both CSVs
    # add code to send an email here...
}