これは既知のトラップです。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もこの配列を展開しますが、そのアイテム(our DataTable
)は展開しません。
これは非常によく似た質問です:
DataSet/DataTableを返すPowerShell関数の奇妙な動作