2016-06-17 7 views
3

最近、私たちは完了するのに非常に時間がかかるスクリプトの作業を開始しました。そこでPowerShellのワークフローを掘り下げました。いくつかのドキュメンテーションを読んだ後、私は基本を忘れてしまいました。しかし、私はforeach -parallelステートメント内の個々のアイテムに対して[PSCustomObject]を作成する方法を見つけることができないようです。Foreach-parallelオブジェクト

説明するためにいくつかのコード:

Workflow Test-Fruit { 

    foreach -parallel ($I in (0..1)) { 

     # Create a custom hashtable for this specific object 
     $Result = [Ordered]@{ 
      Name = $I 
      Taste = 'Good' 
      Price = 'Cheap' 
     } 

     Parallel { 
      Sequence { 
       # Add a custom entry to the hashtable 
       $Result += @{'Color' = 'Green'} 
      } 

      Sequence { 
       # Add a custom entry to the hashtable 
       $Result += @{'Fruit' = 'Kiwi'} 
      } 
     } 

     # Generate a PSCustomObject to work with later on 
     [PSCustomObject]$Result 
    } 
} 

Test-Fruit 

それがうまくいかない部分がSequenceブロック内から$Resultハッシュテーブルに値を追加することです。以下にしようと、それはまだ失敗した場合でも:

$WORKFLOW:Result += @{'Fruit' = 'Kiwi'} 

答えて

1

オーケー、ここであなたが行く、しようとしたテスト:

Workflow Test-Fruit { 

    foreach -parallel ($I in (0..1)) { 

     # Create a custom hashtable for this specific object 
     $WORKFLOW:Result = [Ordered]@{ 
      Name = $I 
      Taste = 'Good' 
      Price = 'Cheap' 
     } 

     Parallel { 

      Sequence { 
       # Add a custom entry to the hashtable 
       $WORKFLOW:Result += @{'Color' = 'Green'} 
      } 

      Sequence { 
       # Add a custom entry to the hashtable 
       $WORKFLOW:Result += @{'Fruit' = 'Kiwi'} 
      } 


     } 

     # Generate a PSCustomObject to work with later on 
     [PSCustomObject]$WORKFLOW:Result 
    } 
} 

Test-Fruit 

これを$ WORKFLOW:varと定義して、そのワークフロー全体でこの範囲を使用してスコープにアクセスします。

+0

これは完全に素晴らしいです!そして、私が探していたもの。 Thom、すばらしい答えをありがとう! :) – DarkLite1

+0

うれしい私は助けることができました! – Thom

+1

$ WORKFLOWに書き込んでいます:並列演算の結果はスレッドセーフですか?インラインスクリプトを実行しているforeach-parallelブロックの場合、両者が同時にこの変数にアクセスしてその結果を書き込もうとする可能性があります。 –

0

あなたはParallelブロックの出力に$Resultを割り当て、その後、他のプロパティを追加することができます。

$Result = Parallel { 
    Sequence { 
     # Add a custom entry to the hashtable 
     [Ordered]@{'Color' = 'Green'}      
    } 

    Sequence { 
     # Add a custom entry to the hashtable 
     [Ordered] @{'Fruit' = 'Kiwi'} 
    } 
} 

# Generate a PSCustomObject to work with later on 
$Result += [Ordered]@{ 
    Name = $I 
    Taste = 'Good' 
    Price = 'Cheap' 
} 

# Generate a PSCustomObject to work with later on 
[PSCustomObject]$Result 
+0

ヘルプマーティンありがとうございます。しかし、私はこれを 'PCCustomObject'に正しく変換することはできません。 'HashTable'として出力します – DarkLite1

+0

あなたは正しいでしょう、おそらく、ハッシュテーブルの型が' Deserialized.System.Collections.Specialized.OrderedDictionary'であるからです。しかし、これを解決する方法を知らない... –

関連する問題