我写了一个小脚本来检查两个文本文件之间的差异。
$new = get-content $outPutFile
$old = get-content $outPutFileYesterday
$result = $null
$result = Compare-Object $old $new
$resultHTML = $result.GetEnumerator() | ConvertTo-Html
Send-MailMessage -SmtpServer 10.14.23.4 -From me@mail.com -To $toAddress -Subject "DiffTest" -Body "$resultHTML" -BodyAsHtml
当我从活动的PowerShell提示符运行它时,一切都很顺利。但是,当我尝试安排它每天运行时,我在运行时遇到此错误(上面的块是在try catch中发送任何执行错误):
方法调用失败,因为[System.Management.Automation.PSCustomObject]不包含名为“GetEnumerator”的方法。
我该如何解决这个问题?
答案 0 :(得分:2)
脚本可能在计划时在不同的用户上下文中运行,可能在文件系统上具有不同的读/写权限集。
但是,在表达式中使用PowerShell arrays are automatically enumerated时,您不需要这样做
在将GetEnumerator()
方法传递给ConvertTo-Html之前调用$resultHTML = $result | ConvertTo-Html
方法。
您可以先将脚本更改为:
{{1}}
并了解它对结果的影响。
答案 1 :(得分:2)
Compare-Object
要么返回:
$null
:如果ReferenceObject和DifferenceObject相等PSCustomObject
类型的对象:如果只有一个项目不同(1) 在这些返回值中,只有最后一个(数组)具有GetEnumerator()
方法。在输入这些返回值时,ConvertTo-Html
会产生预期的输出,因此您可以安全地删除.GetEnumerator()
部分(如Enrico所述)。另一种选择是将$result
包装在一个数组中,这会将脚本的第6行更改为:
$resultHTML = @($result).GetEnumerator() | ConvertTo-Html
(1)这是脚本中compare-object的返回值