2016-07-18 6 views
0

複数のコンピュータからディスク情報を取得して出力したいと考えています。powershell WMIクエリの結果を1つのテーブルにまとめる

これは動作します:

foreach ($args in $file) { 
    get-WmiObject win32_logicaldisk -Credential $cre -ComputerName $args -Filter "Drivetype=3" | 
    ft SystemName,DeviceID,VolumeName,@{Label="Total Size";Expression={$_.Size/1gb -as [int] }},@{Label="Free Size";Expression={$_.freespace/1gb -as [int] }} -autosize 
} 

が、出力は次のようになります。出力は次のようになりますので、

SystemName DeviceID VolumeName Total Size Free Size 
---------- -------- ---------- ---------- --------- 
Computer1 C:  OS    100  31 
Computer1 D:  DATA    500  200 



SystemName DeviceID VolumeName Total Size Free Size 
---------- -------- ---------- ---------- --------- 
Computer2 C:  OS    110  48 
Computer2 D:  DATA    500  201 



SystemName DeviceID VolumeName Total Size Free Size 
---------- -------- ---------- ---------- --------- 
Computer3 C:  OS    100  38 
Computer3 D:  DATA    500  260 

私はそれらを組み合わせたいと思います:

SystemName DeviceID VolumeName Total Size Free Size 
---------- -------- ---------- ---------- --------- 
Computer1 C:  OS    100  31 
Computer1 D:  DATA    500  200 
Computer2 C:  OS    110  48 
Computer2 D:  DATA    500  201 
Computer3 C:  OS    100  38 
Computer3 D:  DATA    500  260 

私はしました新しいオブジェクトの作成を検討しましたが、WMIクエリ結果を同じヘッダーのループ内のそのオブジェクトに追加する方法が不明です。

答えて

0

ForEach-Objectコマンドレットでforeachループを交換し、パイプラインの最後にFormat-Tableft)を移動:

$file |ForEach-Object { 
    Get-WmiObject win32_logicaldisk -Credential $cre -ComputerName $_ -Filter "Drivetype=3" 
} |Format-Table SystemName,DeviceID,VolumeName,@{Label="Total Size";Expression={$_.Size/1gb -as [int] }},@{Label="Free Size";Expression={$_.freespace/1gb -as [int] }} -autosize 

(また、そのような$argsを使用していない、それはautomatic variableです)


あなたのスクリプトの後半でWMIからの出力を使用する予定の場合は、代わりにSelect-Objectを使用Format-Table

$LogicalDisks = $file |ForEach-Object { 
    Get-WmiObject win32_logicaldisk -Credential $cre -ComputerName $_ -Filter "Drivetype=3" 
} |Select-Object SystemName,DeviceID,VolumeName,@{Label="Total Size";Expression={$_.Size/1gb -as [int] }},@{Label="Free Size";Expression={$_.freespace/1gb -as [int] }} 

# Do some stuff with $LogicalDisks 
# ... 

# Time to display the disks to the user 
$LogicalDisks |Format-Table -AutoSize 
+1

もう少しそれがないように、この作品理由として:あなたは表示にそれを必要とするとき

その後Format-Tableを使用しています。 OPで使用される 'ForEach'ループは、各項目を個別に処理し、' Format-Table'のそれ自身の実行に出力します。パイプ内の 'ForEach-Object'関数は、各項目を個別に処理する間に、パイプの次の部分のすべての出力結果と' Format-Table'コマンドレットの一回の実行を収集しますすべてのデータ – TheMadTechnician

+0

これは完璧です、ありがとうございます。私は今For-EachObjectがどのように動作するかを理解していると信じています – ElectronicDrug

+0

また、私は$ argsを正しく使っています。さらに私が含まなかったスクリプトには、 '$ defaultServerList = 'computers.txt''と' $ file = get-Content $ defaultServerList'があります。 – ElectronicDrug

関連する問題