Это известная ловушка: 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
).
Вот очень похожий вопрос:
Странное поведение в функции PowerShell, возвращающей DataSet / DataTable