Ceci est un trap connu: PowerShell traite votre DataTable
comme une collection de DataRow
éléments. C'est la toute première commande
$dt | Export-CliXml -path "c:\exports\data.xml"
déjà "oublie" la table de données. Vous pouvez jeter un oeil au fichier de sortie, il commence par 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>
Pour éviter cet effet, utilisez l'opérateur ,
(il semble drôle, mais c'est exactement comment cela fonctionne):
, $dt | Export-CliXml -path "c:\exports\data.xml"
par conséquent, le fichier de sortie commence maintenant avec 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>
Après cela, vous pouvez importer la table arrière:
$dt = Import-CliXml -path "c:\exports\data.xml"
Vérifions-le:
$dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataRow
…
On peut voir le même effet (DataRow
au lieu de DataTable
). Ainsi, la commande est correcte avec ,
:
, $dt | Get-Member
# output:
TypeName: Deserialized.System.Data.DataTable
…
Alors, nous déshydratons vraiment un DataTable
de cette façon.
===
EDIT: Cet effet est connu sous le nom déroulant. PowerShell a tendance à dérouler les collections. L'opérateur virgule crée un tableau d'un seul élément. PowerShell déroule également ce tableau, mais il ne déroule pas ses éléments (notre DataTable
).
Voici une question similaire:
Strange behavior in PowerShell function returning DataSet/DataTable
Merci, mais cela me laisse encore un problème: $ dt2 = (Import-clixml de « c: \ exportations \ data.xml ") $ dt2.GetType(). Nom Objet [] $ dt2 | Get-Member TypeNom: Deserialized.System.Data.DataTable – Chris
Quel est le problème? (BTW, vous faites quelque chose de différent que je l'ai suggéré). –
Si je sauve la table de la façon dont vous dites, puis importer avec: $ dt = Import-clixml -path "c: \ exportations \ data.xml" dt.GetType() $ donne l'erreur: "Invocation de méthode a échoué car [Deserialized.System.Data.DataTable] ne contient pas une méthode nommée 'GetType'" Lorsque je passe $ dt dans ma fonction qui nécessite un DataTable, je reçois: Impossible de convertir le "système .Collections.ArrayList "valeur de type" System.Collections.ArrayList "pour taper" System .Data.DataTable ". – Chris