2016-12-23 28 views
5

CSVファイルを読み込み、データから所定のコレクションを返すPowershellスクリプトを作成しました。以下は、上記スクリプトの出力例です。私はそうのようPSObjectに格納することにより、C#での結果を得ることができていますPowershell PSObjectをC#のDataTableとして返します

Count  Name 
------ ------ 
    12  Rubies 
    3  Pearls 
    20  Emeralds 

:今、私は、単一のオブジェクトを期待していたときに

var shell = PowerShell.Create(); 
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1"); 
Collection<PSObject> results = shell.Invoke(); 

、私はそれぞれの値を得ることができていますし、

foreach (PSObject psObject in results) 
{ 
    localVariable = Convert.ToString(psObject.Properties["Name"].Value); 
} 

ただし、この解決策を動的なものに変換する際に問題があります。すなわち、行の数は変化すると予想される。だから私は前にこれを実装しました。ソースがSQLデータベースの場合、hereというポストに類似したソリューションを使用していましたので、データテーブルを移動するべきだと仮定しましたが、このシナリオでは動作しません。任意のアイデアや提案?ありがとう!

注:Powershellスクリプトコンポーネントは、出力を作成するための他のメカニズムを含んでいるので、ここでは必須です.C#を使用してCSVファイルから読み込むだけですが、これはオプションではありません。

+0

あなたはどんな問題を抱えていますか?私が理解したところから、結果をすべて反復して問題なくプロパティにアクセスしているので、さまざまな行数によって引き起こされる正確な問題は何ですか? –

+0

こんにちはルーカス、私はそこにいくつの行があるか分かっている場合、私は値を取得することができます。 (配列は 'array [0]'や 'array [1]と同様に参照されます)。私はすべての結果をデータテーブルに格納できる関数を作成しようとしています。それをクリアする希望。 – Yad

+0

foreachステートメントを使用して反復処理を行うときは、配列参照は必要ありません。あなたがそうしたとしても、for文を使うことができます。 –

答えて

1

あなたの質問から理解したことは、さらなるデータ処理のためにDataTableを使用したいと思っており、それぞれのコレクションで使用したいということです。

あなたはこのように進めることができます。

DataTable dt=new DataTable(); 
dt.Colums.Add("Count"); 
dt.Colums.Add("Name"); 
foreach (PSObject psObject in results) 
{ 
    foreach(PSPropertyInfo prop in psObject.Properties) 
    { 
    var count=prop.Name; 
    var name=prop.Value; 
    //In other words generate output as you desire. 
    dt.Rows.Add(count,name); 
    } 
} 

は、それはあなたのために役立ちます願っています。

マニュアル作成が存在している:Doc 1

1

Doc 2すでにcsvファイルを読むためにPowerShellを使用しているので、なぜ続けませんか?

C#で管理を開始する前に、* .ps1ファイルの結果を反復処理するためにpowershellコマンド/スクリプトを呼び出すことができます。

c#でスクリプトを起動するのは簡単です。スクリプトをファイルとして作成する必要はありません。スクリプトテキストを直接送信して呼び出すことができます。スクリプトの結果が返された後、私はパイプを追加

var shell = PowerShell.Create(); 
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1 | foreach {do-something $_}"); 
Collection<PSObject> results = shell.Invoke(); 

お知らせ:

多分あなたも、2類似したのを組み合わせることができます。 'AddScript'はpowershell.exeにたくさんのテキストを送るのと非常によく似ていることに注意してください。私は組み込みリソースからスクリプトファイル全体をこのメソッドにプッシュしました。

1

使用LINQの:そして

IEnumerable<dynamic> dynamicResults = from item in results          
             select new { Name = item.Name, Count = item.Count }; 

はmyDataGrid.ItemsSource = dynamicResultsを設定します。

関連する問題