gpt4 book ai didi

powershell - 在 PowerShell 中加载序列化数据表 - 返回数据行数组而不是数据表

转载 作者:行者123 更新时间:2023-11-30 23:56:49 24 4
gpt4 key购买 nike

我正在尝试在 PowerShell 中保存和加载数据表。
我这样保存:

$dt | Export-CliXml -path "c:\exports\data.xml"

并像这样加载它:
$dt = Import-CliXml -path "c:\exports\data.xml"

但是我返回的类型是一个 Rows 数组而不是一个 DataTable!
这给我带来了重大问题,因为它需要传递到需要 DataTable 的函数中,并且不能强制转换为一个。

非常感谢任何帮助,谢谢。

最佳答案

这是一个已知的陷阱:PowerShell 处理您的 DataTable作为DataRow的集合项目。这是第一个命令

$dt | Export-CliXml -path "c:\exports\data.xml"

已经“忘记”了数据表。您可以查看输出文件,它以 DataRow 开头。 :
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Data.DataRow</T>

为避免这种影响,请使用 ,运算符(看起来很有趣,但这正是它的工作原理):
, $dt | Export-CliXml -path "c:\exports\data.xml"

结果,输出文件现在以 DataTable 开头。 :
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Data.DataTable</T>

之后,您可以将表导入回来:
$dt = Import-CliXml -path "c:\exports\data.xml"

让我们检查一下:
$dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataRow


我们可以看到相同的效果( DataRow 而不是 DataTable )。因此,正确的命令是 , :
, $dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataTable


所以,我们真的脱水了 DataTable通过这种方式。

===

编辑:这种效果被称为展开。 PowerShell 倾向于展开集合。逗号运算符创建单个项目的数组。 PowerShell 也会展开此数组,但不会展开其项目(我们的 DataTable)。

这是一个非常相似的问题:

Strange behavior in PowerShell function returning DataSet/DataTable

关于powershell - 在 PowerShell 中加载序列化数据表 - 返回数据行数组而不是数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com