2015-12-17 18 views
5

PowerShellの新機能ではなく、C#の新機能です。C#コンソール経由のPowerShell

PowerShellコードを実行するのにC#を使いたいと思います。ただし、オブジェクトの出力は、PowerShellウィンドウでコマンドを実行するのと同じではありません。そのデータではなくオブジェクトの名前が返されます。

string script = @" 
    get-process | ft 
"; 

PowerShell powerShell = PowerShell.Create(); 

powerShell.AddScript(script); 
var results = powerShell.Invoke(); 
foreach (var item in results) 
{ 
    Console.WriteLine(item); 
} 

戻り値:

Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

をしかし、それはより多くを返すPowerShellのコマンドラインウィンドウでここに私がしようとしているものです形式化テーブルビュー:

PS C:\ Dropbox \ PowerShell> ps | ft

ハンドルNPM(K)WS(K)VM(M)CPU ID SI プロセス名 ------- ------ ----- - -------- --------- ------------------- 131 12 1980 2572 85 0.45 13216 1 acrotray

本当に2つの物事:PowerShellコマンドウィンドウと同じ出力を生成します

  1. コード
  2. ので、私はどのようにNAに学ぶことができる何が起こっているかの説明もっとうまくいってください。

ありがとうございます!

+1

可能性のある複製http://stackoverflow.com/questions/24661972/output-a-powershell-object-into-a-string – RobSiklos

答えて

3

codeprojectのコード例のおかげで、私は "out-string"コマンドをすべてのコマンドの最後に追加する必要があることを理解しました。追加する追加コードは次のとおりです。

ps.AddCommand( "Out-String");

コンソールがこれを単に行っているのか、それともそれ以上あるのかなと思います。

+0

私はホストがそうしていると思います(コンソールホストかISEホスト、それはその機能の一部です)。デフォルトでは実行されないC#のランスペースを使用すると、今やっていることは問題ありません。また、アプリケーションを本格的なホストにしてそこに実装することもできます。 – briantist

+0

PowerShellエンジンは、未請求のオブジェクトを 'Out-Default'コマンドに暗黙的にパイプし、' Out-Default'はそれらをホスト上のテキストに変換します。 – PetSerAl

0

PowerShellは独自のXML書式設定ドキュメントを使用して、コンソールとISEでテーブルスタイルの出力を返します。 Out-Stringは、書式設定を保持するため、この書式設定が有効になる場所です(out-stringで '-Stream'スイッチを使用すると、実行された各行を返すことができます)。

out-stringを使用せずにC#に渡されたオブジェクトから情報を抽出することは可能です。しかし、あなたがこの情報を表示しているのであれば私の経験では、文字列を返すことをお勧めします。ただし、オブジェクトに対して追加の処理を行う必要がある場合は、オブジェクトを返すことができ、処理しているオブジェクトのタイプに基づいて条件を実行することができます。たとえば、PowerShellから返されたオブジェクトを操作する必要がある場合( 'out-string'を使用しない場合)は、次のようにします:

System.Diagnostic。プロセスは、Get-Processコマンドからご返されるオブジェクトのタイプである - 私はあなたの質問でそれを見ていないので、私はまた、推薦するあなたが戻ってC#

using (PowerShell psRunspace = PowerShell.Create()) 
     { 
      psRunspace.AddCommand("Get-Process"); 
      psRunspace.AddParameter("ComputerName", computerName); 

      Collection<PSObject> outputObj = psRunspace.Invoke(); 

      foreach (PSObject obj in outputObj) 
      { 
       var objProperties = obj.Properties; 
       var objMethods = obj.Methods; 
       var baseObj = obj.BaseObject; 

       if (baseObj is System.Diagnostic.Process) 
       { 
        var p = (System.Diagnostic.Process)baseObj; 
        //you can now access all members of this object normally 
        //Do something here with p.Properties or p.Methods etc... 
       } 
      } 

に渡して入力してくださいあなたがオブジェクトを正確に把握してくださいpowershellコマンドを実行するために 'using'ステートメントを使用することを検討してください。パイプライン/ランスペースを開いて閉じます。あなたの例では、あなたのサンプルコードからそれを省略しない限り、パイプラインを閉じたようには見えません。また、あなたの呼び出しコマンドでは、返すオブジェクトに適切な型を使用し、返されるオブジェクトの型(PSObject)で上記のようにCollectionを使用するようにしてください。

関連する問題