これは既知のトラップです。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関数の奇妙な動作