我有两个我要比较的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中提取它并将其添加到电子邮件代码中。
答案 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...
}