Create dynamic custom objects

(To define an actual class see How to make a custom class)

Say you have two variables, $name and $count -- and you want to create a custom object that contains just those two properies....

$myObject = New-Object psobject -property  @{name = $name; count = $count}

Or say you are in a pipeline, within which $name and $count become available... you want to pipe out a custom object with those two properties...

dir *.xml | % {
	$name = $_.FullPath
	$count = $_.Length
	# ^^ just for example

	New-Object psobject -property  @{name = $name; count = $count}

	# ^^ Return our custom object... for the next actor in the pipeline to deal with...

} | ConvertTo-CSV  -NoTypeInformation | out-file "Name_And_Count.csv"

Similar: PSCustomObject

[PSCustomObject]@{
	Name = $_.FullPath
	Count = $_.Length
}

This is newer. It's slightly less typing. It can have other improvements.

What's the difference?

both avenues will output the data as NoteProperties in the System.Management.Automation.PSCustomObject object types

—source

See also