Chr*_*ris 4 datatable powershell xml-serialization xml-deserialization
我正在尝试在PowerShell中保存和加载DataTable.我这样保存:
$dt | Export-CliXml -path "c:\exports\data.xml"
Run Code Online (Sandbox Code Playgroud)
并加载它像这样:
$dt = Import-CliXml -path "c:\exports\data.xml"
Run Code Online (Sandbox Code Playgroud)
但我得到的类型是一行Rows而不是DataTable!这导致了我的主要问题,因为它需要传递给需要DataTable的函数,并且它不能被转换为一个.
任何帮助非常感谢,谢谢.
这是一个已知的陷阱:PowerShell将您处理DataTable
为DataRow
项目集合.这是第一个命令
$dt | Export-CliXml -path "c:\exports\data.xml"
Run Code Online (Sandbox Code Playgroud)
已经"忘记"了数据表.您可以查看输出文件,它以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>
Run Code Online (Sandbox Code Playgroud)
要避免这种影响,请使用,
运算符(看起来很有趣,但这正是它的工作原理):
, $dt | Export-CliXml -path "c:\exports\data.xml"
Run Code Online (Sandbox Code Playgroud)
因此,输出文件现在以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>
Run Code Online (Sandbox Code Playgroud)
之后,您可以导入表格:
$dt = Import-CliXml -path "c:\exports\data.xml"
Run Code Online (Sandbox Code Playgroud)
我们来检查一下:
$dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataRow
…
Run Code Online (Sandbox Code Playgroud)
我们可以看到相同的效果(DataRow
而不是DataTable
).因此,正确的命令是,
:
, $dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataTable
…
Run Code Online (Sandbox Code Playgroud)
所以,我们真的DataTable
以这种方式脱水.
===
编辑:此效果称为展开.PowerShell倾向于展开集合.逗号运算符创建单个项的数组.PowerShell也会展开此数组,但它不会展开其项目(我们的DataTable
).
这是一个非常相似的问题:
PowerShell函数中的奇怪行为返回DataSet/DataTable
归档时间: |
|
查看次数: |
4535 次 |
最近记录: |