2011-07-19 11 views
3

私は参考としてこれを使用しています:http://msdn.microsoft.com/en-us/library/dd182449(v=VS.85).aspxC#のアプリケーションコードから呼び出されたときPowershellがなぜnullになるのですか?

したがって、実装は非常に似ています。私は、下記の1-ライナーコマンドによって意図したコンピュータからのプロセス情報を取得するには、次のPowerShellコマンドを実行している:

$computer = "Remote.Computer.Here"; Get-Process -computer $computer | Sort-Object WorkingSet -desc | Select-Object -first 10 | Format-Table -property name, ID, @{Expression= {$_.WorkingSet/1mb};Label="MemoryLoad";} -auto 

上記のコマンドは、PS・ウィンドウで完全に実行されます。しかし、C#のアプリケーションコードから呼び出されると、私は返品を受け取りません。特にので、私は以下を介してアクセスするとき:。

 PowerShell shell = PowerShell.Create(); 
     shell.AddScript(CmdletMap[PSVocab.OsProcLoad]); 
     Collection<PSObject> obj = shell.Invoke(); 

     DataTable dt = new DataTable(); 
     dt.Columns.Add("ProcessName"); 
     dt.Columns.Add("ID"); 
     dt.Columns.Add("MemoryLoad"); 

     DataRow row; 
     foreach (PSObject resultObject in obj) 
     { 
      row = dt.NewRow(); 
      row["ProcessName"] = resultObject.Members["name"].Value; 
      row["ID"] = resultObject.Members["id"].Value; 
      row["MemoryCol"] = resultObject.Members["MemoryLoad"].Value; 

      dt.Rows.Add(row); 
     } 

[] resultObject.Membersのクイックウォッチを行う価値は単にnullを返します。

助けが必要ですか?

ありがとうございました。

+0

http://meta.stackexchange.com/questions/2950/ 〜からのお礼 - タグラインと挨拶の投稿からの投稿 – Kiquenet

答えて

1

使用わずかに異なる2つのコマンド:C#の(およびコンソール)用と別のコンソールのみのため。 C#とコンソールから呼び出すため

:等インタラクティブホスト(すなわちコンソール、ISEについて

$computer = "." 
Get-Process -computer $computer | Sort-Object WorkingSet -desc | Select-Object -first 10 | 
Select-Object -property name, ID, @{Expression= {$_.WorkingSet/1mb};Label="MemoryLoad"} 

)きれいな表情で:

$computer = "." 
Get-Process -computer $computer | Sort-Object WorkingSet -desc | Select-Object -first 10 | 
Select-Object -property name, ID, @{Expression= {$_.WorkingSet/1mb};Label="MemoryLoad"} | 
Format-Table -AutoSize 

それはC#で問題を作るFormat-Tableです。 C#では使用しないでください。コンソールに関しては、それはパイプラインの最後のコマンドでなければならず、それは印刷のためのオブジェクトを生成し、それ以上の使用はしません。例:最初のコマンドショー 2列IDが、2番目のコマンドは任意の名にプロパティを取得できません:

Get-Process | Format-Table -property name, ID 
Get-Process | Format-Table -property name, ID | Select-Object name 
+0

これです。 Format-Tableは、コンソールのフォーマット処理専用の書式設定オブジェクトを返します。代わりにSelect-Objectを使用してください。 – JasonMArcher

2

shell.Streams.Errorを調べて、スクリプトの呼び出しでどのようなエラーが発生しているのか確認してください。

1

Technetによると、構文が間違っています。 。 。

http://technet.microsoft.com/en-us/library/dd347630.aspx

構文

のGet-プロセス[[-Name] [-ComputerName] [-FileVersionInfo] [-Module] []

のGet-プロセス-Id [ -ComputerName] [-FileVersionInfo] [-Module] []

のGet-プロセス-InputObject [-ComputerName] [-FileVersionInfo] [-Modul e] []

具体的には、コンピュータではなくコンピュータ名を使用する必要があります。そして、私は "Remote.Computer.Here"が何であるか分かりません。 。あなたはlocalhostを使うことができます。

編集

Nmが、私の同僚は馬鹿です。私はちょうど.とRemote.Computer.hereを交換しなければならなかったし、それはすべての罰金とダンディーに見えます。それが動作するかどうかを確認します。

+0

'コンピュータ'を使用して私の一部のtypoだった。 localhostの使用に関しては、すでに試してみましたが、結果は変わりません。 – Jae

+0

'' localhost ''の代わりに '.'を試してください。実際には、スクリプトを大きく修正して動作させる必要があります。私はパワーシェルのエキスパートではありませんが、スクリプトにはいくつかの作業が必要だと彼は言いました。 。 。 – surfasb

2

PowerShellでは、失敗した操作の既定値は何も返しません。 PowerShellにはいくつかのよく知られているストリームがあり、エラーストリーム([PowerShell] .Streams.Error)にエラーがあるか、終了エラー([Powershell] .InvocationStateInfo.Reason)です。

これが役に立てば幸い、

+0

エラーが存在する可能性があるヒントについて、両方を調べましたが、Streams.ErrorとInvocationStateInfo.Reasonの両方でエラーが発生したことを示すものが見つかりませんでした。私が好奇心を感じたのは、shell.AddCommand( "Out-String")を追加すると値が文字列形式で返されるということです。それは間違いなくそこにありますが、いつもよりも見つけるのは苦痛です。 – Jae

+0

@ psobject.immediateBaseObjectの代わりに@psobject.immediateBaseObjectを参照してください.psobjectを使ってプロパティ値を突き刺すのではなく(上記のコードと同じように) –

+0

http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-投稿から削除される挨拶 – Kiquenet

関連する問題