【问题标题】:Convert saved PSCustomObject (as string) back to hashtable将保存的 PSCustomObject(作为字符串)转换回哈希表
【发布时间】:2016-08-03 05:40:34
【问题描述】:

我有一个进程解析出大量 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 可能有用,但你不能导出到字符串。至少据我所知。

【问题讨论】:

  • Import-Csv 生成 PSCustomObjects 数组而不是哈希表。你能解释一下“看时”是什么意思吗?您如何查看结果?
  • 我可能错了,但PSCustomObjects 创建与哈希表的使用不一样吗?我会更新帖子以澄清。
  • @DaveSexton 我还更新了标题以反映您对 PSCustomObject 的注释,而不是哈希表。

标签: powershell hashtable string-conversion


【解决方案1】:

您要查找的内容称为序列化。一种直接的方法是使用内置的对象序列化 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>

【讨论】:

  • 我可以让这更动态吗?我试图避免这样的强类型。
  • @TimMeers 也许吧。您能否更详细地解释对象有什么问题,以便发明一种解决方法会更容易?无论如何,对象是 Powershell 的亮点,我认为没有理由避免它们。
  • 这不是我在避免,而是我试图让它更像import-csv。它在不知道名称的情况下从 CSV 导入命名对象。这里我已经有一个PSCustomObject字符串了,怎么不能转换回来?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2012-12-12
  • 2021-12-30
  • 2015-08-24
相关资源
最近更新 更多