Преобразование сохраненного объекта PSCustomObject (в виде строки) обратно в хеш-таблицу

У меня есть процесс, анализирующий ряд документов CSV и сохраняющий изменения для последующей обработки в базе данных. Когда одна строка (человек) в любом из CSV не найдена в базе данных людей, процесс сохраняет эту запись из CSV. В настоящее время я сохраняю его как строковый вывод хеш-таблицы. Итак, документ CSV

First,Last,Office
Joe,Smith,Detroit

На выходе import-csv "path to my doc.csv" при использовании отладчика в VS 2015 строка отображается как:

@{First=Joe; Last=Smith; Office=Detroit;}

Он также расширяется до набора ключей / значений:

First  | Joe
Last   | Smith
Office | Detroit

В PowerShell я могу просто использовать имена объектов в таблице как $obj.First и двигаться дальше. Но я не могу сохранить эту строку в базе данных и вернуть ее как пригодный для использования объект PowerShell. Я всегда получаю строковый литерал.

Есть ли способ преобразовать эту строку обратно в хеш-таблицу или другую пару ключ / значение?

Я попробовал:

$data = ConvertFrom-String $raw -PropertyNames First,Last,Office

Я пробовал это как для необработанной строки, так и для нее, которая просто возвращает строку с именами свойств в ней. Я также преобразовал исходный хеш в массив:

[string[]]$l_array = $raw | out-string

Затем, когда я конвертирую его обратно с помощью команды ConvertFrom-String, он фактически сдвигает элементы данных и добавляет ключи в качестве значений.

Спасибо за помощь. Я могу предоставить более подробную информацию или образец кода по мере необходимости.

Изменить Другая сторона этого: как я могу сохранить данные, которые в настоящее время являются PSCustomObject, в лучшем формате, которые я могу перестроить в тот же PSCustomObject? Я подумал, возможно, Export-CSV может сработать, но вы не можете экспортировать в строку. По крайней мере, насколько я могу судить.


person Tim Meers    schedule 12.04.2016    source источник
comment
Import-Csv создает массив объектов PSCustomObject, а не хеш-таблицу. Вы можете объяснить, что значит смотреть? Как вы оцениваете результат?   -  person Dave Sexton    schedule 12.04.2016
comment
Я могу ошибаться, но разве PSCustomObjects create не используется так же, как хеш-таблица? Я обновлю пост, чтобы прояснить.   -  person Tim Meers    schedule 12.04.2016
comment
@DaveSexton Я также обновляю заголовок, чтобы отразить ваше примечание о PSCustomObject, а не о хеш-таблице.   -  person Tim Meers    schedule 12.04.2016


Ответы (1)


То, что вы ищете, называется сериализацией. Самый простой способ - использовать встроенные командлеты сериализации объектов: _1 _ и Import-CliXml.

Первый сохранит ваш объект как файл XML. Его можно сохранить как на диске, так и в базе данных. Когда вам понадобится объект позже, извлеките XML-документ и заново создайте объект, десериализовав его. Вот так,

# Create simple object
$o = New-Object -TypeName PSObject
$o | Add-Member -Name "Attr1" -Value "Val1" -MemberType NoteProperty
$o | Add-Member -Name "Attr2" -Value "Val2" -MemberType NoteProperty
$o

Attr1 Attr2
----- -----
Val1  Val2

# Serialize it
Export-Clixml -Path ./myObj.xml -InputObject $o

# Deserialize as another object, print it
$p = Import-Clixml -Path .\myObj.xml
$p

Attr1 Attr2
----- -----
Val1  Val2

# Look at file contents for magic!    
Get-Content .\myObj.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <S N="Attr1">Val1</S>
      <S N="Attr2">Val2</S>
    </MS>
  </Obj>
</Objs>
person vonPryz    schedule 12.04.2016
comment
Могу ли я сделать это более динамичным? Я стараюсь избегать такой строгой типизации. - person Tim Meers; 12.04.2016
comment
@TimMeers Может быть. Не могли бы вы более подробно объяснить, что не так с объектами, чтобы было проще изобрести обходной путь? В любом случае объекты - это то место, где Powershell сияет, и я не вижу причин избегать их. - person vonPryz; 12.04.2016
comment
дело не в том, что я избегаю, а в том, что я пытаюсь заставить его действовать как import-csv. Он импортирует именованные объекты из CSV, не зная имен. Здесь у меня уже есть строка PSCustomObject, как нельзя конвертировать обратно? - person Tim Meers; 12.04.2016