Author Posts

January 1, 2012 at 12:00 am

by andrewv88 at 2012-12-04 22:59:41

hello,
i tried to get my output in table format wihtout any success,

[code2=powershell]$vms = "testvm", "testvm1"

foreach ($vm in $vms){

$dbname = (get-datastore -vm $vm).name
$dbsize = (get-datastore -vm $vm).CapacityGB
$vmos = (get-vmguest -vm $vm).OSFullName

}[/code2]

i want to get my output in this format
[code2=powershell]name dbname dbsize OS
——– ————- ————– ——–
testvm nfs_w2k8 1.2Tb Windows 2008R2
testvm1 nfs_w2k8 1.2Tb Windows 2008R2[/code2]

thanks

by nohandle at 2012-12-05 00:58:03

You have to create a custom object. If you are on powershell v2 I'l recommend the Select-object way beause it sorts properties unlike the new-object using hashtable as property.
Excellent article by Don to learn how to do it: http://technet.microsoft.com/en-us/maga ... 50381.aspx

by nohandle at 2012-12-05 01:03:40

Here is the fish. 🙂
"" | Select-Object @{n="name";e={$vm}},@{n="dbName";e={$dbname}},@{n="dbSize";e={$dbsize}},@{n="OS";e={$vmos}}

by andrewv88 at 2012-12-05 01:49:52

i tried to do new object

[code2=powershell]$vms = "testvm", "testvm1"

$object = new-object Object

foreach ($vm in $vms){

$object | add-member NoteProperty "DB Name" $vm
$object | add-member NoteProperty "DB Name" (get-datastore -vm $vm).name
$object | add-member NoteProperty "DB Size" (get-datastore -vm $vm).CapacityGB
$object | add-member NoteProperty "OS Name" (get-vmguest -vm $vm).OSFullName

}[/code2]

but input has only the property of last vm

by RichardSiddaway at 2012-12-05 04:20:24

Its because you aren't outputting the object you create. You overwrite on each loop through foreach

by andrewv88 at 2012-12-05 04:24:48

i tried to use array for saving $obj for each loop, outside the foreach loop

$myArray += $obj

it wasn't work

by nohandle at 2012-12-05 04:41:28

I think the solution shown by me should work when placed inside the foreach loop.

by andrewv88 at 2012-12-05 04:45:13

i solved it, but the way is not good enough.

[code2=powershell]$vms = "testvm", "testvm1"

$myArray = @()
$object = new-object Object

foreach ($vm in $vms){

$object | add-member NoteProperty "DB Name" $vm
$object | add-member NoteProperty "DB Name" (get-datastore -vm $vm).name
$object | add-member NoteProperty "DB Size" (get-datastore -vm $vm).CapacityGB
$object | add-member NoteProperty "OS Name" (get-vmguest -vm $vm).OSFullName

$myArray += $obj
$object = new-object Object
}[/code2]

$myArray now contain properties from 2 vms and i can you Format-table

by megamorf at 2012-12-05 08:20:25

$vms = "testvm", "testvm1"

$myArray = @()

foreach ($vm in $vms){

$name = $vm.name
$dbname = (get-datastore -vm $vm).name
$dbsize = (get-datastore -vm $vm).CapacityGB
$vmos = (get-vmguest -vm $vm).OSFullName

$myArray += "" | Select-Object @{n="name";e={$name}},@{n="dbName";e={$dbname}},@{n="dbSize";e={$dbsize}},@{n="OS";e={$vmos}}

}

$myArray | format-table -autosize

What are you trying to achieve? You collect objects in an array and can decide how you want to output it by using the format-Cmdlets like format-list, format-table, etc (get-command -verb format)

by andrewv88 at 2012-12-05 12:10:25

megamorf thanks !

by megamorf at 2012-12-05 12:31:49

[quote="andrewv88"]megamorf thanks ![/quote]

Well, I quickly wrote that on my way home. I'd do it with a hashtable like this (I like to have clean code so that my colleagues can understand what's going on):

$vms = "testvm", "testvm1"
$myArray = @()
foreach ($vm in $vms){

$properties = @{$name = $vm.name;
$dbname = (get-datastore -vm $vm).name;
$dbsize = (get-datastore -vm $vm).CapacityGB;
$vmos = (get-vmguest -vm $vm).OSFullName
}

$myArray += New-Object –TypeName PSObject –Prop $properties
}

$myArray | format-table -autosize