powershell - 如何比较 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 函数名称,而不是差异。我似乎无法弄清楚哪里出了问题。请问有哪位可以帮忙吗?一直试图弄清楚一整天,但没有运气。
解决方案
您必须按属性过滤输出的差异对象,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
过滤器仍然按预期工作。
- 这使您能够将字符串发送到输出文件;没有
推荐阅读
- blockchain - 物联网设备在私有区块链中的信任建立
- c - 相同的字符串但不同的结果
- c++ - 定义方法的 GoogleTest C++ 应用程序崩溃
- android - 如何使用 java 依赖于 xamarin android 项目?
- php - 如何从文本文件 validate 中读取第一行,然后将文件的其余部分读入数组?
- python - gunicorn 使用的默认配置是什么?
- javascript - 如何打开具有相应 ID 的模态 div?
- visual-studio - 用 SSDT 中的变量替换数据库名称
- c# - 我正在尝试按周或按月显示约会,但我无法(C#)
- c# - 预制件的实例没有被单独控制