5

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

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

并像这样加载它:

$dt = Import-CliXml -path "c:\exports\data.xml"

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

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

4

1 回答 1

6

这是一个已知的陷阱: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

===

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

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

返回 DataSet/DataTable 的 PowerShell 函数中的奇怪行为

于 2010-11-04T17:39:48.840 回答