调度Powershell更改ObjectType

时间:2012-03-09 10:12:48

标签: powershell scripting automation powershell-v2.0

我写了一个小脚本来检查两个文本文件之间的差异。

    $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”的方法。

我该如何解决这个问题?

2 个答案:

答案 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的返回值