私は実行していますTest-AdfsServerHealth
(参照)
問題は、出力値の1つ(値名Output
)がとして表示される配列であり、System.Collection.Hashtable
これを適切なExcel形式で取得する方法を見つけようとしていることです。
たとえば、これは、エクスポートしたときのCSVの実際の値の1つです。
名前結果詳細出力 TestServiceAccountPropertiesパス "" System.Collections.Hashtable
しかし、PowerShellは次のように表示します。
名前:TestServiceAccountProperties 結果:パスの 詳細: 出力:{AdfsServiceAccount、AdfsServiceAccountDisabled、AdfsServiceAccountLockedOut、 AdfsServiceAccountPwdExpired ...} ExceptionMessage:
私が実行している実際のコマンドは次のとおりです。
$ServerResult = Test-AdfsServerHealth
tl; dr:
Test-AdfsServerHealth |
Select-Object Name, Result, Detail, @{
n='Output'
e={ $_.prop2.GetEnumerator().ForEach({ '{0}={1}' -f $_.Key, $_.Value }) -join ' ' }
} | ExportTo-Csv out.csv
上記は、各.Output
ハッシュテーブルのエントリを<key>=<value>
、CSV出力で適切に機能するスペースで区切られたペア(PSv4 +構文)で構成される1行の文字列にシリアル化します。
以来CSVは、テキスト形式、PowerShellは、彼らの呼び出しによってエクスポートするオブジェクトをシリアライズ.ToString()
する方法を。
そのような複雑なオブジェクト[hashtable]
のインスタンスは、多くの場合、ちょうど彼らの完全な型名を得(System.Collections.Hashtable
)のために.ToString()
CSVに有用ではありません、。
簡略化された例(私はを使用ConvertTo-Csv
していますが、例はに類似して適用されますExport-Csv
):
# Create a custom object whose .col2 property is a hashtable with 2
# sample entries and convert it to CSV
PS> [pscustomobject] @{ prop1 = 1; Output = @{ name='foo'; ID=666 } } | ConvertTo-Csv
"prop1","Output"
"1","System.Collections.Hashtable"
からのすべての出力オブジェクトのプロパティにTest-AdfsServerHealth
同じハッシュテーブル構造がある.Output
場合は、エントリ列を独自に作成してハッシュテーブルをフラット化することができますが、そうではないようです。
したがって、ハッシュテーブルを単一のCSV列に収まるテキスト表現に手動で変換する必要があります。
これは、変換を実行Select-Object
する計算プロパティを使用して行うことができますが、CSVファイルのコンテキストで意味のあるテキスト表現を決定する必要があります。
次の例では、スペースで区切られた<key>=<value>
ペアで構成される1行の文字列が作成されます(PSv4 +構文)。
[pscustomobject] @{ prop1 = 1; Output = @{ name='foo'; ID=666 } } |
Select-Object prop1, @{
n='Output'
e={ $_.prop2.GetEnumerator().ForEach({ '{0}={1}' -f $_.Key, $_.Value }) -join ' ' }
} | ConvertTo-Csv
計算されたprop2
プロパティを作成するハッシュテーブル形式の説明については、私のこの回答を参照してください。
上記の結果:
"prop1","prop2"
"1","ID=666 name=foo"
ただし、ハッシュテーブルの値が、型名のみにシリアル化される複雑なオブジェクトである場合は、このアプローチを再帰的に適用する必要があることに注意してください。
CSVファイルにエクスポートするオブジェクトのハッシュテーブル値のプロパティがすべて同じ構造である場合は、ハッシュテーブルエントリをそれぞれ独自の出力列にすることを選択できます。
次のサンプル入力を見てみましょう。.prop2
値が均一なキー(エントリ)のセットを持つハッシュテーブルである2つのカスタムオブジェクトのコレクション:
$coll = [pscustomobject] @{ prop1 = 1; prop2 = @{ name='foo1'; ID=666 } },
[pscustomobject] @{ prop1 = 2; prop2 = @{ name='foo2'; ID=667 } }
(関心のある)キー名が事前にわかっている場合は、計算されたプロパティの明示的なリストを使用して、個々の列を作成できます。
$coll | select prop1, @{ n='name'; e={ $_.prop2.name } }, @{ n='ID'; e={ $_.prop2.ID } } |
ConvertTo-Csv
上記の利回り、以下のハッシュテーブルのエントリは、独自の列になったことを示す、name
とID
:
"prop1","name","ID"
"1","foo1","666"
"2","foo2","667"
キー名が事前にわからない場合は、より高度なテクニックが必要です。
# Create the list of calculated properties dynamically, from the 1st input
# object's .prop2 hashtable.
$propList = foreach ($key in $coll[0].prop2.Keys) {
# The script block for the calculated property must be created from a
# *string* in this case, so we can "bake" the key name into it.
@{ n=$key; e=[scriptblock]::Create("`$_.prop2.$key") }
}
$coll | Select-Object (, 'prop1' + $propList) | ConvertTo-Csv
これにより、計算されたプロパティの固定リストを使用して、前のコマンドと同じ出力が生成されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加