首页 > 解决方案 > 如何比较 power-shell 中的两个文本文件并将差异发送到电子邮件

问题描述

我有 2 个包含 SQL 函数名称列表的文本文件。我希望能够比较 $A 和 $B 中的列表。然后,我想要一个在 $B 中而不是在 $A 中的 SQL 函数名称列表,即列表 $C 作为电子邮件地址的附件发送。

这是我的代码:

   $A = "c:\ReferenceFunctions.txt"
   $B = "c:\GeneratedFunctions.txt"
   $C = "c:\FileWithDifferences.txt"


    $fromaddress = "noreply@xyz"
    $toaddress = "123@hhh"
    $bccaddress = "3333@nnn.com"
    $login = "yourlogin"
    $password = "password" | Convertto-SecureString -AsPlainText -Force
    $smtpserver = "gggg.com" 
    $smtp = new-object Net.Mail.SmtpClient($smtpserver, 800)
    $smtp.EnableSsl = $true
    $smtp.Credentials = New-Object System.Net.NetworkCredential($login, 
    $password);
    $body = "see attached "
    $Subject = "checking differences"
    $message = new-object System.Net.Mail.MailMessage
    $message.From = $fromaddress
    $message.To.Add($toaddress)
    #$message.CC.Add($CCaddress)
    $message.Bcc.Add($bccaddress)
    $message.IsBodyHtml = $True
    $message.Subject = $Subject

    $message.body = $body
    $message.Priority = [System.Net.Mail.MailPriority]::High

Compare-object (Get-Content $A) (Get-Content $B) | Out-File  $C

#Attach the eported file with differences
$attachment = $C
$attach = new-object Net.Mail.Attachment($attachment)
$message.Attachments.Add($attach)

IF (Compare-Object -ReferenceObject (Get-Content $A) -DifferenceObject (Get-Content $B)){


    $smtp.Send($message);
} 

变量 $A 的信息如下:

fn_StatementEndOfMonth                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
fn_Performance_Sql                                                                                                                                                                                     
fn_DailyReturns 

变量 $B 具有以下信息:

fn_Performance_Sql                                                                                                                                                                                     
fn_DailyReturns 
fn_SQLPerfomance_Monitor

$C 然后应该包含

fn_SQLPerfomance_Monitor

此代码的问题在于,它发送的附件包含文件 $A 和 $B 中的所有 SQL 函数名称,而不是差异。我似乎无法弄清楚哪里出了问题。请问有哪位可以帮忙吗?一直试图弄清楚一整天,但没有运气。

标签: powershell

解决方案


您必须按属性过滤输出的差异对象,Compare-Object.SideIndicator以便仅获取给定侧唯一的项目(PSv3+ 语法):

Compare-Object (Get-Content $A) (Get-Content $B) -PassThru | 
  Where-Object Sideindicator -eq '=>' | 
    Out-File $C
  • Where-Object Sideindicator -eq '=>'仅输出那些表示右侧唯一的项目的差异对象(即第二个参数,在这种情况下为文件行)。$B

    • 差异对象是[pscustomobject]表示输入集合之间的单个差异的实例。它有两个属性:
      • .SideIndicator包含一个箭头(字符串),指向当前输入对象唯一的一侧:<==>; 如果你使用这个-IncludeEqual开关,两个集合中的对象都用==
      • .InputObject表示手头的输入对象。
  • -PassThru导致Compare-Object输出输入对象本身而不是通常的差异对象:

    • 这使您能够将字符串发送到输出文件;没有-PassThru,Out-File会将差异对象作为一个整体写入,从而生成表格表示;您必须访问该.InputObject属性才能仅获取字符串。
    • 但是,一个.SideIndicator属性仍然存在,因为 PowerShellNoteProperty为每个对象添加了一个具有该名称的成员,因此Where-Object过滤器仍然按预期工作。

推荐阅读