Добавление PSCustomObject в Array дает ошибку, но работает нормально при отладке кода в коде Visual Studio - PullRequest
0 голосов
/ 31 октября 2019

При чтении данных из 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)

1 Ответ

0 голосов
/ 31 октября 2019

Я предполагаю, что это зависит от того, сколько записей уже есть в вашем лог-файле.

Если есть только одна запись, 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 есть несколько строк, вы получите массив Object s:

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 знает, как сделать += на всех этих типах ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...