Сравнить PSCustomObject с объектом - PullRequest
1 голос
/ 15 апреля 2019

Я создал PsCustomObject, когда вызывается переменная ISE, она читает таблицу соответствующих данных.Однако, если я пытаюсь сравнить PsCustomObject с другим объектом, PsCustomObject не читается правильно.Я хотел бы сообщить сценарию, что любая из строк в существующем CSV соответствует PSCustomObject, не экспортирует данные в CSV, другими словами, пропускает повторяющиеся строки в файле CSV.CSV может иметь или не иметь несколько строк.

$fileInfo = @(
                        [pscustomobject]@{
                            user_id = $user
                            studio = $studio
                            function = $Task
                            end_time_local = $creationTime
                            asin = $ASIN
                            variant = $variant
                            process_class_id = $processClass
                            }
                           )
$currentData = Import-Csv "$scansFolder\$fileName.csv"
if($fileInfo -ne $currentData){
$fileInfo | Export-Csv "$scansFolder\$fileName.csv" -Append -NoTypeInformation -Force
}

1 Ответ

2 голосов
/ 15 апреля 2019

[pscustomobject] является типом .NET ссылки , поэтому сравнение двух экземпляров [1] с -eq будет проверять на равенство ссылок (идентичность), т.е. если два экземпляра один и тот же объект [2] - что явно не так в вашем сценарии.

Предполагая, что свойства ваших пользовательских объектов являются экземплярами типов значений или строк (что имеет место), вы можете использовать Compare-Object для сравненияобъекты по их значениям свойств , с возможностью сравнения двух коллекций :

$fileInfo = @(
  [pscustomobject]@{
      user_id = $user
      studio = $studio
      function = $Task
      end_time_local = $creationTime
      asin = $ASIN
      variant = $variant
      process_class_id = $processClass
      }
)

# Get the property names.
# This assumes that the CSV data has (at least) the same
# set of properties (columns).
$propNames = $fileInfo[0].psobject.properties.Name

$currentData = Import-Csv "$scansFolder\$fileName.csv"

# Compare the $fileInfo custom object(s) to the custom objects read
# from the CSV file and only export those that are unique to the RHS ('=>')
# back to the file, i.e., those that don't match $fileInfo.
Compare-Object -Property $propNames $fileInfo $currentData |
  Where-Object SideIndicator -eq '=>' | Select-Object InputObject | 
    Export-Csv "$scansFolder\$fileName.csv" -Append -NoTypeInformation -Force

[1] Import-Csv выходных данных [pscustomobject] экземпляры тоже.

[2] См. раздел справки Сравнение равенства (написан для C #, но применяется аналогично оператору PowerShell -eq).

...