2017-12-16 8 views
2

リモートホストからCSV文字列の形で情報を収集しようとしています。 1つのCSVファイルにそれらを累積するために返される値が特に必要です。スクリプトブロックに注文されたハッシュテーブルを渡すと、注文が破損する

キーを特定の順序に保つために順序付きハッシュテーブルを使用しますが、リモートホストに渡すと順序が壊れます。

注文を保存する方法はありますか?

$ordered_hash = [ordered]@{"a" = 1; "b" = 2; "c" = 3} 
$ordered_hash 
$scriptblock = { 
param ($hash) 
$hash 
} 
Invoke-Command -ComputerName localhost -ScriptBlock $scriptblock -ArgumentList ([hashtable]$ordered_hash) 

戻り値:

Name       Value                                  
----       -----                                  
a        1                                   
b        2                                   
c        3                                   
c        3                                   
b        2                                   
a        1                                   
+0

可能な回避策:https://stackoverflow.com/q/14891044/56778 –

+0

'-ArgumentList([ハッシュテーブル] $のordered_hash)' - > '-ArgumentList $ ordered_hash'? –

+0

PowerShellのシリアライゼーションシステムには、次のような問題があります。 '$ s = [System.Management.Automation.PSSerializer]; $ o = [順序付け] @ {}; $ o.GetType()。FullName; $ s :: Deserialize($ s :: Serialize($ o))。GetType()。FullName' – PetSerAl

答えて

1

あなたが[ordered]属性を使用してハッシュテーブルを定義すると、実際にはSystem.Collections.Specialized.OrderedDictionaryを作成します。

HashTableタイプのパラメータに渡すときは、OrderedDictionaryHashTableに変換します。

秩序を維持するには、次のオプションのいずれかを使用することができます。

  • は、タイプの変更を防ぐために、スクリプトブロックのパラメータからタイプを削除します。このようにして、元のタイプは使用OrderedDictionaryです。

それとも

  • スクリプトブロックのパラメータのSystem.Collections.Specialized.OrderedDictionaryタイプを使用してください。
+0

私は共有した例で両方のオプションを試してみましたが、どちらも正しく動作しています。あなたがその答えについて質問があれば教えてください... –

+0

私のために働かなかった。私は同じ結果を得た。 $ ordered_hash = [順序付け] @ {"a" = 1; "b" = 2; "C" = 3} $ ordered_hash $スクリプトブロック= { PARAM($ハッシュ) $ハッシュ } Invoke-Commandコマンド-ComputerNameローカルホスト-ScriptBlock $スクリプトブロック-ArgumentList([System.Collections.Specialized.OrderedDictionary] $のordered_hash ) –

+0

私は両方を試して、それは完璧に働いた。 –

関連する問題