将保存的PSCustomObject(作为字符串)转换回哈希表

时间:2016-04-12 14:23:39

标签: powershell hashtable string-conversion

我有一个进程解析出大量CSV文档并保存更改,以便以后在数据库中处理。当在人员数据库中找不到任何CSV中的一行(一个人)时,该过程将从CSV中保存该记录。我目前将它保存为哈希表的字符串输出。所以CSV文件

First,Last,Office
Joe,Smith,Detroit

在VS 2015中使用调试器时import-csv "path to my doc.csv"的输出字符串可视化为:

@{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可能有用,但你不能导出到字符串。至少据我所知。

1 个答案:

答案 0 :(得分:0)

您正在寻找的是序列化。一种直接的方法是使用内置对象序列化cmdlet:Export-CliXmlImport-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>