2017-02-24 15 views
0

export-csvの出力、アウトグリッドビュー、およびコンソールへの結果にのみ影響する簡単な問題はあります。一連のサーバー上で「処理」することで上位5つのプロセスをキャプチャします。Powershell Array to export-csv shows System.Object []

次のようにコードがある:

$Servers = "Server1", "Server2", "Server3" 
$OutArray = @() 
ForEach ($Item in $Servers) 

$Top5 = Get-Process -Computer $Item | Sort Handles -descending |Select -First 5 

    $OutArray += New-Object PSObject -property @ { 
    Server = $Item 
    Top5 = $Top5 

    } #OutArray 

} #ForEach 

$OutArray | Export-csv Test.csv 

次のように彼らはCSV表示で、しかし...

Server Top5                                                   
------ ----                                                   
SERVER1 {@{ProcessName=svchost.exe; PercentCpuLoad=13.79}, @{ProcessName=services.exe; PercentCpuLoad=11.4}, @{ProcessName=WmiPrvSE.exe; PercentCpuLoad=10.03}, @{ProcessName=irfilcol.exe; PercentCpuLoad=9.79}...} 

を次のようにコンソールを介して、細かい探して出てくるその結果:

Server Top5 
Server1 System.Object[] 
Server2 System.Object[] 
Server3 System.Object[] 

$ Top5変数が1つのserに対して複数のプロパティ(それぞれ5個)を持つ変数であると考えていますver。 export-csvに実際の値が表示されるように、コードを修正するにはどうすればよいですか?

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

私はCSV結果は、それがPowerShellの伝説英中銀のProxからの投稿を閲覧するBenHからの提案を使用してGridViewの

enter image description here

を示しています、次のようになりたいと思い、私は今、次の作業があります。

$Top5 = Get-Process -Computer $Item | Sort Handles -descending |Select -expand Handles | |Select -First 5 
$new = [pscustomobject]@{ Top5 = (@($Top5) -join ',') 
} 

ちょうど約今、この作業を得た:

私はformattinのより多くの部分を追加したいですTop5Processesは(カッコ)で使用される実際のCPU%を持っているグラムは、今、私は私が上記の二つを組み合わせることができれば、それは、出力ごとに良くなり、

Top2Proc       Top2CPU     
services.exe,BESClient.exe   32.76,16.6 

ただし、出力のために、以下の持っています値は1になりますので、次のようになります。

Top2Proc 
Services(32.76), BesClient.exe(16.6) 

どのようにしたらよいでしょうか?

+0

PowerShellは、そのデータとそれができる最善を尽くしています。そのオブジェクトをその "セル"内の文字列としてどのように表現するかはわかりません。あなたは何をすべきかを伝える必要があります。現時点では、出力のために期待していることは表示されません。 CSVは文字列で区切られたデータの集合です。そのデータ構造を保持したい場合は、JSONまたはXMLなどを使用する必要があります。 – Matt

+0

投稿が更新され、out-gridview経由で表示されるスクリーンショットが表示されます。これは '私がCSV – Kenny

+0

この[Boe Proxのブログ記事](https://learn-powershell.net/2014/01/24/avoiding-system-object-or-similar-output-when-using-export-csv/)が役立ちます問題を説明してください。注:下のスクリプトセンターリンクが壊れています。スクリプトは[his GitHub](https://github.com/proxb/PowerShell_Scripts)にあります – BenH

答えて

1

このテーブルをcsvファイルに表示する場合は、文字列Top5をそのようにフォーマットする必要があります。 Out-Stringを使用すると、そのようになります

オブジェクトを一連の文字列としてホストに送信します。

だから、単純な変更はあなたが望むものを得るはずです。

$Top5 = Get-Process -Computer $Item | 
    Sort Handles -descending | 
    Select -First 5 | 
    Out-String 

モノスペースフォントで表示されていないとき、それはあなたがOut-GridViewで見る多くのように少し醜いになります。また、$top5の先頭と末尾の空白を削除するには、.Trim()を使用することを検討してください。

これに対処する他の方法があります。必要に応じて上記をFormat-Table/Format-Listと組み合わせて使用​​できます。一般的には、ホストに表示されるように出力を保存する場合は、Out-Stringがテスト対象となります。


最初の列がコンピュータ名である各プロセスに1つの行を追加しようとしました。そうすれば、必要に応じてソートや照会が可能な、より構造化された出力を得ることができます。

ComputerName ProcessName Handles 
------------ ----------- ------- 
Computer1 avp   54639 
Computer1 OUTLOOK  7708 
Computer1 RDTabs   6108 
Computer1 svchost  3160 
Computer1 chrome   2530 

このデータをエクスポートするには、他の方法を使用することができます。実際にはデータのレシピに依存しますが、Export-CLIMXLConvertTo-JSON | Set-Contentのような他のコマンドレットがあります。あなたのプロセスを有効にする

+0

ありがとうございます。私はアウトストリングを試しましたが、結果は空白で奇妙です。 – Kenny

+0

Excelを開くと結果が空白になりますか?データはそこにありますが、折りたたまれたセルでは表示されないことがあります。あなたが結果を隠しているかもしれない "テーブル"の前後に空白があります。テキストファイルにデータが含まれていますか? – Matt

+0

ああ!はい、そこにあります、下にスクロールする必要があります!これで今どこかになっています – Kenny

1

使用Select-ObjectExport-Csvにそれらをパイプする前に文字列にオブジェクト:

$OutArray |Select-Object Server,@{Expression={$_.Top5.Name -join ';'}} |Export-Csv test.csv 
+0

Thx、Mathais、それを試してみます – Kenny

+0

これは、単一のプロパティが必要な場合にのみ機能します。 OPはすべてを求めているようだ – Matt