Загрузка сериализованного DataTable в PowerShell - возвращает массив DataRows, а не DataTable - PullRequest
4 голосов
/ 04 ноября 2010

Я пытаюсь сохранить и загрузить DataTable в PowerShell.Я сохраняю это так:

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

и загружаю так:

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

Но тип, который я получаю, - это массив строк, а не DataTable!Это вызывает у меня большие проблемы, так как его нужно передать в функцию, которая требует DataTable, и не может быть приведена к ней.

Любая помощь с благодарностью, спасибо.

1 Ответ

5 голосов
/ 04 ноября 2010

Это известная ловушка: 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

...