5

PowerShellでDataTableを保存およびロードしようとしています。私はそれをこのように保存します:

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

次のようにロードします。

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

しかし、私が返すタイプは、DataTableではなくRowsの配列です!これは、DataTableを必要とする関数に渡す必要があり、1つにキャストできないため、大きな問題を引き起こしています。

どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

6

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

于 2010-11-04T17:39:48.840 に答える