[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

Powershell Enumerate memebers of a PSObject

Posted on 2012-03-22
8
Medium Priority
?
2,880 Views
Last Modified: 2012-03-29
Hi,

I am trying to work out how to write a powershell function that can enumerate all members of a PSObject and print the Member name and its value.

So if an object has 3 properties then I might see an output like the following:

Employee_Name : Fred
Employee_Age  : 18
Employee_Sex  : Male

So I am trying to write really a generic function that can handle any PSOBject (or other powershell object) and work it out.

In this simple example I have provided some code.

I know C# Reflection and was wondering how powershell would do it.

So in the example below in fnTest I would like to have something like:

function fnTest($data)
{
         foreach ($item in $data)
                  {
                         write-host $item.Label:  $item.Value
                   }
}

Thanks,

Ward.

function fnTest($data)
{
	# Here is want to seperate the Item Name and its value
}
		

$employee_list = @();		
$employee1 = New-Object PSObject
$employee1 | Add-Member Noteproperty Employee_Name -Value "Fred"
$employee1 | Add-Member Noteproperty Employee_Age -Value 18
$employee1 | Add-Member Noteproperty Employee_Sex -Value "Male"
$employee_list += $employee1
$employee2 = New-Object PSObject
$employee2 | Add-Member Noteproperty Employee_Name -Value "John"
$employee2 | Add-Member Noteproperty Employee_Age -Value 22
$employee2 | Add-Member Noteproperty Employee_Sex -Value "Male"
$employee_list += $employee2
$employee3 = New-Object PSObject
$employee3 | Add-Member Noteproperty Employee_Name -Value "Jane"
$employee3 | Add-Member Noteproperty Employee_Age -Value 32
$employee3 | Add-Member Noteproperty Employee_Sex -Value "Female"
$employee_list += $employee3

foreach ($employee in $employee_list)
{
    fnTest $employee  # <-- Function to enumerate object properties.
}

Open in new window

0
Comment
Question by:whorsfall
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 11

Expert Comment

by:Joe Klimis
ID: 37756355
Hi you are doing well
you example is almost correct

$employee_list = @();		
$employee1 = New-Object PSObject
$employee1 | Add-Member Noteproperty Name -Value "Fred"
$employee1 | Add-Member Noteproperty Age -Value 18
$employee1 | Add-Member Noteproperty Sex -Value "Male"
$employee_list += $employee1
$employee2 = New-Object PSObject
$employee2 | Add-Member Noteproperty Name -Value "John"
$employee2 | Add-Member Noteproperty Age -Value 22
$employee2 | Add-Member Noteproperty Sex -Value "Male"
$employee_list += $employee2
$employee3 = New-Object PSObject
$employee3 | Add-Member Noteproperty Name -Value "Jane"
$employee3 | Add-Member Noteproperty Age -Value 32
$employee3 | Add-Member Noteproperty Sex -Value "Female"
$employee_list += $employee3

foreach ($employee in $employee_list)
{
    write-host "name : " , $employee.Name , "          Age: " , $employee.age , "           Sex: " , $Employee.sex

}
     

Open in new window



I hope this helps
joe
0
 
LVL 1

Author Comment

by:whorsfall
ID: 37756466
Hi,

Thanks for your response . I think u misunderstood my question a bit. I probably should of phrased it better. I wanted the fnTest function to be able to handle any type of PSObject passed to it and be able to enumerate the members.

So if I passed a different type of object with different members eg say "car_type" and "car_color" it can enumerate the $data variable within the fnTest function.

So fnTest can handle any type of object passed to it.

Sorry for the confusion

Ward
0
 
LVL 11

Expert Comment

by:Joe Klimis
ID: 37757679
There may better ways

but this work  for your example

use it like this

detailobject $employee_list

or
detailobject (get-process)


function detailObject($object)
{
$Properties = $object | gm -type Property,noteproperty
$Pcount = $properties.count
$counter = 0
While ( $counter -lt $pcount)
{ $name = ($properties[$counter].name) 
  $value = $object[$counter].$name
  Write-host "name : $name      Value:   $Value"
$counter++
}
}	 
	 

Open in new window

0
Are your AD admin tools letting you down?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 71

Expert Comment

by:Qlemo
ID: 37757900
Any reason you do not just use format-list *  ?
0
 
LVL 18

Expert Comment

by:Learnctx
ID: 37762231
Yeah I don't know why you wouldn't just use Select-Object * or Format-List *. These will both achieve what you want. If you did want a function to do it though, I guess you would have a reason...
Function fnTest($data)
{
    $arrProperties = $data | GM -MemberType Properties | Select -ExpandProperty Name
    Foreach ($property in $arrProperties)
    {
        Write-Host "$($property): $($data.$property)"
    }
}

Open in new window

But pretty much the output will be the same as just doing a format-list.
0
 
LVL 1

Author Comment

by:whorsfall
ID: 37762260
Hi,

Thanks for your answers. The reason why I am not using the standard methods is I posted this a more simple example.

What I wanted to do in the fnTest() function later exapand it so it can automate excel using COM.

So the first row would output the columns heading then below that I would put the members each data item into to each cell.

So the first row would be headings, the next row would be employee1 and the next row
employee2 and so on.

So in the modified version I might pass the variable $employee_list.

The excel com objects need me to fill the values cell by cell.

So I could not work out how to break up each item one by one.

However if there is a better way please let me know.

Thanks,

Ward.

e.g:

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook1 = $excel.Workbooks.Add()

# write into cell B5 (column 2, line 5):
$workbook1.ActiveSheet.Cells.Item(5,2)= "I can write directly to cells!"

# read cell content
$content = $workbook1.ActiveSheet.Cells.Item(5,2).Text
"Cell B5 content: $content"
</code>
0
 
LVL 71

Accepted Solution

by:
Qlemo earned 2000 total points
ID: 37762577
Something like this?
set-StrictMode -Version latest

function Obj2XLS ([PSobject] $data)
{
  $excel = New-Object -ComObject excel.application
  $excel.visible=$true
  $wb = $excel.Workbooks.Add()            # empty, unnamed workbook

  #   Delete all but one work sheet
  $excel.DisplayAlerts = $false
  for ($i = $wb.Worksheets.Count; $i -ge 2; --$i) {$wb.Worksheets.Item($i).Delete()}
  $excel.DisplayAlerts = $true
  $ws = $wb.Worksheets.Item(1)

  $arrProperties = $data | gm -MemberType Properties 
  
  $row = 1
  $col = 1
  $arrProperties | % {
    $ws.Cells.Item($row, $col).value2 = $_.Name
    $ws.Cells.Item($row, $col++).Font.Bold = $true
  }
  $data | % {
    $row++
    $col = 1
    foreach ($prop in $arrProperties) {
      $ws.Cells.Item($row, $col).value2 = $_.$($prop.Name)
      $col++
    }
  }
  $ws.usedRange.EntireColumn.AutoFit() | Out-Null
  # $wb.SaveAs("YourFileNameHere")
  # $excel.Quit()
}

# --------------------------

$employee_list = @();		
$employee = New-Object PSObject
$employee | Add-Member Noteproperty Name -Value "Fred"
$employee | Add-Member Noteproperty Age -Value 18
$employee | Add-Member Noteproperty Sex -Value "Male"
$employee_list += $employee | select *
$employee.Name = "John"
$employee.Age  = 22
$employee.Sex  = "Male"
$employee_list += $employee | select *
$employee.Name = "Jane"
$employee.Age  = 32
$employee.Sex  = "Female"
$employee_list += $employee | select *


obj2XLS $employee_list

Open in new window

0
 
LVL 1

Author Closing Comment

by:whorsfall
ID: 37785789
Awsome - thanks :)
0

Featured Post

Are You Ready for GDPR?

With the GDPR deadline set for May 25, 2018, many organizations are ill-prepared due to uncertainty about the criteria for compliance. According to a recent WatchGuard survey, a staggering 37% of respondents don't even know if their organization needs to comply with GDPR. Do you?

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In the absence of a fully-fledged GPO Management product like AGPM, the script in this article will provide you with a simple way to watch the domain (or a select OU) for GPOs changes and automatically take backups when policies are added, removed o…
A walk-through example of how to obtain and apply new DID phone numbers to your cloud PBX enabled users that are configured in Office 365. Whether you have 1, 10 or 100+ users in your tenant, it's quite easy to get them phone-enabled and making/rece…
Learn the basics of lists in Python. Lists, as their name suggests, are a means for ordering and storing values. : Lists are declared using brackets; for example: t = [1, 2, 3]: Lists may contain a mix of data types; for example: t = ['string', 1, T…
The viewer will learn how to count occurrences of each item in an array.
Suggested Courses

650 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question