PowerShell Export-Csv повторяет последнее значение в выводе - решение

СЦЕНАРИЙ: В моем сценарии я создаю объект, добавляю общую информацию, а затем обновляю вспомогательную информацию для каждого объекта в цикле и добавляю этот объект в массив объектов. Мое подробное описание показывает, что значения верны в объекте, добавленном в массив (сообщая о последнем элементе в массиве), но Export-Csv повторяет значения последнего объекта. Я могу решить эту проблему, если каждый раз создаю новый объект. Повторное использование одного и того же объекта повторяет последнее значение, хотя я вижу его правильным, когда выбираю * для объектов в массиве. В объекте массива должно быть что-то, например, guid, который дублируется для того же объекта. PowerShell 5.1 проверен на Windows 7, Windows 2008R2, Windows 2010R2

РЕШЕНИЕ. Не используйте объект повторно при добавлении его в массив объектов.

ВЫХОД:

#TYPE MyGpoSetting
"SetName","SetCategory","SetType","SetState","SetValue","SetData","SetNote","SubName","SubState","SubValue","GpoDomain","GpoName","GpoLinks","GpoGuid"
"SetName","SetCategory","SetType","SetState","SetValue","SetData","SetNote","SubName3","SubState3","SubValue3","GpoDomain","GpoName","GpoLinks","GpoGuid"
"SetName","SetCategory","SetType","SetState","SetValue","SetData","SetNote","SubName3","SubState3","SubValue3","GpoDomain","GpoName","GpoLinks","GpoGuid"
"SetName","SetCategory","SetType","SetState","SetValue","SetData","SetNote","SubName3","SubState3","SubValue3","GpoDomain","GpoName","GpoLinks","GpoGuid"

СЦЕНАРИЙ:

Add-Type -TypeDefinition @"
   public struct MyGpoSetting
   {
      public string  SetName;
      public string  SetCategory;
      public string  SetType;
      public string  SetState;
      public string  SetValue;
      public string  SetData;
      public string  SetNote;
      public string  SubName;
      public string  SubState;
      public string  SubValue;
      public string  GpoDomain;
      public string  GpoName;
      public string  GpoLinks;
      public string  GpoGuid;
   }
"@
$aoMyGpoSetting = @();
$oMyGpoSetting = New-Object -TypeName 'MyGpoSetting';
$oMyGpoSetting.SetName       = 'SetName';
$oMyGpoSetting.SetCategory   = 'SetCategory';
$oMyGpoSetting.SetType       = 'SetType';
$oMyGpoSetting.SetState      = 'SetState';
$oMyGpoSetting.SetValue      = 'SetValue';
$oMyGpoSetting.SetData       = 'SetData';
$oMyGpoSetting.SetNote       = 'SetNote';
$oMyGpoSetting.SubName       = 'SubName1';
$oMyGpoSetting.SubState      = 'SubState1';
$oMyGpoSetting.SubValue      = 'SubValue1';
$oMyGpoSetting.GpoDomain     = 'GpoDomain';
$oMyGpoSetting.GpoName       = 'GpoName';
$oMyGpoSetting.GpoLinks      = 'GpoLinks';
$oMyGpoSetting.GpoGuid       = 'GpoGuid';
$aoMyGpoSetting += $oMyGpoSetting;
#--- $oMyGpoSetting = New-Object -TypeName 'MyGpoSetting';
$oMyGpoSetting.SetName       = 'SetName';
$oMyGpoSetting.SetCategory   = 'SetCategory';
$oMyGpoSetting.SetType       = 'SetType';
$oMyGpoSetting.SetState      = 'SetState';
$oMyGpoSetting.SetValue      = 'SetValue';
$oMyGpoSetting.SetData       = 'SetData';
$oMyGpoSetting.SetNote       = 'SetNote';
$oMyGpoSetting.SubName       = 'SubName2';
$oMyGpoSetting.SubState      = 'SubState2';
$oMyGpoSetting.SubValue      = 'SubValue2';
$oMyGpoSetting.GpoDomain     = 'GpoDomain';
$oMyGpoSetting.GpoName       = 'GpoName';
$oMyGpoSetting.GpoLinks      = 'GpoLinks';
$oMyGpoSetting.GpoGuid       = 'GpoGuid';
$aoMyGpoSetting += $oMyGpoSetting;
#--- $oMyGpoSetting = New-Object -TypeName 'MyGpoSetting';
$oMyGpoSetting.SetName       = 'SetName';
$oMyGpoSetting.SetCategory   = 'SetCategory';
$oMyGpoSetting.SetType       = 'SetType';
$oMyGpoSetting.SetState      = 'SetState';
$oMyGpoSetting.SetValue      = 'SetValue';
$oMyGpoSetting.SetData       = 'SetData';
$oMyGpoSetting.SetNote       = 'SetNote';
$oMyGpoSetting.SubName       = 'SubName3';
$oMyGpoSetting.SubState      = 'SubState3';
$oMyGpoSetting.SubValue      = 'SubValue3';
$oMyGpoSetting.GpoDomain     = 'GpoDomain';
$oMyGpoSetting.GpoName       = 'GpoName';
$oMyGpoSetting.GpoLinks      = 'GpoLinks';
$oMyGpoSetting.GpoGuid       = 'GpoGuid';
$aoMyGpoSetting += $oMyGpoSetting;
$aoMyGpoSetting | Export-Csv -Path 'c:\temp\export.csv' -Encoding 'ASCII';

1 ответ

Это работает, как ожидалось. Добавление объекта в массив (+=) не копирует объект, но вместо этого добавляет ссылку / указатель на него в следующем "слоте". Таким образом, вы добавляете три ссылки на один и тот же объект. Это как 3 записи в вашей телефонной книге для вашего лучшего друга:

John Smith - 01234 5678
Jonnie - 01234 5678
Smith, John - 01234 5678

Кого бы вы ни назвали, вы сможете связаться с одним и тем же человеком.

Аналогично, каждый раз, когда PowerShell отображает объект из вашего массива, он фактически возвращается к одному и тому же исходному объекту и показывает его вам. Вот почему все они имеют те же свойства, что и последний добавленный вами, - на самом деле они все одинаковые.

Как вы обнаружили, создание нового объекта каждый раз является способом продолжить.

Другие вопросы по тегам