【问题标题】:Scheduling Powershell changes ObjectType调度 Powershell 更改 ObjectType
【发布时间】:2012-03-26 19:10:56
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: powershell scripting automation powershell-2.0


    【解决方案1】:

    脚本可能在调度时在不同的用户上下文中运行,可能在文件系统上具有不同的读/写权限集

    但是,在 PowerShell arrays are automatically enumerated 中使用表达式时,您不需要 在传递给ConvertTo-Html之前调用GetEnumerator()方法。

    您可以先将脚本更改为:

    $resultHTML =  $result | ConvertTo-Html
    

    看看它如何影响结果。

    【讨论】:

      【解决方案2】:

      Compare-Object 要么返回:

      • $null: 如果 ReferenceObject 和 DifferenceObject 相等
      • PSCustomObject 类型的对象:如果只有一项不同 (1)
      • 对象数组:如果发现多个差异

      在这些返回值中,只有最后一个(数组)具有GetEnumerator() 方法。 ConvertTo-Html 在输入这些返回值中的任何一个时都会产生预期的输出,因此您可以安全地删除 .GetEnumerator() 部分(如 Enrico 所述)。另一种选择是将 $result 包装在一个数组中,这会将脚本的第 6 行更改为:

      $resultHTML = @($result).GetEnumerator() | ConvertTo-Html

      (1) 这是脚本中 compare-object 的返回值

      【讨论】:

        猜你喜欢
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        • 2013-08-16
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多