在 PowerShell 中加载序列化的 DataTable - 返回 DataRows 数组而不是 DataTable

发布于 2024-09-30 11:59:57 字数 315 浏览 4 评论 0原文

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

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

并像这样加载它:

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

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

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

I'm trying to save and load a DataTable in PowerShell.
I save it like this:

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

and load it like this:

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

But the type I get back is an array of Rows rather than a DataTable!
This is causing me major problems as it needs to be passed into a function which requires a DataTable, and it cannot be cast to one.

Any help greatly appreciated, thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不是你的备胎 2024-10-07 11:59:57

这是一个已知的陷阱: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 而不是 <代码>数据表)。因此,正确的命令是 ,

, $dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataTable
…

因此,我们确实以这种方式对 DataTable 进行脱水。

===

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

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

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

This is a known trap: PowerShell processes your DataTable as a collection of DataRow items. That is the very first command

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

already “forgets” the data table. You may take a look at the output file, it starts with 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>

To avoid this effect, use the , operator (it looks funny but that’s exactly how it works):

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

As a result, the output file now starts with 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>

After that you can import the table back:

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

Let’s check it:

$dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataRow
…

We can see the same effect (DataRow instead of DataTable). Thus, the correct command is with ,:

, $dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataTable
…

So, we really dehydrate a DataTable in this way.

===

EDIT: This effect is known as unrolling. PowerShell tends to unroll collections. The comma operator creates an array of a single item. PowerShell unrolls this array, too, but it does not unroll its items (our DataTable).

Here is a very similar question:

Strange behavior in PowerShell function returning DataSet/DataTable

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文