【问题标题】:Adding PSCustomObject to Array gives Error, but works fine when debugging the code in Visual Studio Code将 PSCustomObject 添加到数组会产生错误,但在 Visual Studio Code 中调试代码时可以正常工作
【发布时间】:2019-10-31 09:48:36
【问题描述】:

从 CSV 文件中读取数据,然后尝试将新的自定义对象添加到列表中时,我在运行脚本时遇到错误,但是当我尝试调试代码时,我按预期工作,但我不知道找出为什么它在调试模式下可以工作,但在正常运行时却不行。

    $global:scanTime = Get-date
    $script:logfile_Database = Import-Csv -Path "${logSpace}\${CSV_logfileData}" -Delimiter ";"
    $currentLogfile = Get-ChildItem -Path "$($logfile.Path)\$($logfile.FileName)" -ErrorAction Stop
    $logfile_Data = [PSCustomObject]@{
        scanTime = $scanTime.ToString("yyyy-MM-ddTHH:mm:ss")
        size = $currentLogfile.Length
    }
    $logfile_Database += $logfile_Data

预期结果:带有最后测量值的数组。

非调试模式时出错:

错误:方法调用失败,因为 [System.Management.Automation.PSObject] 不包含名为“op_Addition”的方法。


更新

现在可以使用以下代码更新,但我仍然想知道为什么调试模式和正常模式之间的代码执行存在差异。

    $global:scanTime = Get-date
    [System.Collections.ArrayList]$script:logfile_Database = Import-Csv -Path "${logSpace}\${CSV_logfileData}" -Delimiter ";"
    $currentLogfile = Get-ChildItem -Path "$($logfile.Path)\$($logfile.FileName)" -ErrorAction Stop
    $logfile_Data = [PSCustomObject]@{
        scanTime = $scanTime.ToString("yyyy-MM-ddTHH:mm:ss")
        size = $currentLogfile.Length
    }
    $logfile_Database.add($logfile_Data)

【问题讨论】:

    标签: powershell visual-studio-code


    【解决方案1】:

    我猜这取决于你的日志文件中有多少条目。

    如果只有一个条目,Import-Csv 将返回一个PSCustomObject(注意,我在下面使用ConvertFrom-Csv,但Import-Csv 的工作方式相同):

    PS> $x = ConvertFrom-Csv "aaa, bbb, ccc`r`nxxx, yyy, zzz"
    PS> $x.GetType().FullName
    System.Management.Automation.PSCustomObject
    

    但如果 csv 文件中有多行,您会得到一个 Objects 数组:

    PS> $x = ConvertFrom-Csv "aaa, bbb, ccc`r`nppp, qqq, rrr`r`nxxx, yyy, zzz"
    PS> $x.GetType().FullName
    System.Object[]
    

    在第一种情况下,PowerShell 告诉您它不知道如何将新条目附加到 PSCustomObject,因为该类型上没有定义 op_Addition 方法。

    您可以通过以下几种方式将 ConvertFrom-Csv / Import-Csv 的结果强制转换为数组:

    PS> $x = @( ConvertFrom-Csv "aaa, bbb, ccc`r`nxxx, yyy, zzz" )
    PS> $x.GetType().FullName
    System.Object[]
    
    PS> [object[]] $x = ConvertFrom-Csv "aaa, bbb, ccc`r`nxxx, yyy, zzz"
    PS> $x.GetType().FullName
    System.Object[]
    

    或者,如您所见:

    PS> [System.Collections.ArrayList] $x = ConvertFrom-Csv "aaa, bbb, ccc`r`nxxx, yyy, zzz"
    PS> $x.GetType().FullName
    System.Collections.ArrayList
    

    而且 PowerShell 知道如何对所有这些类型执行 +=...

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多