user1205746
user1205746

Reputation: 3364

Select-Object of multiple properties

I am trying to find an elegant way to put the metadata of a table of type System.Data.DataTable into a multi-dimensional array for easy reference in my program. My approach to the issue so far seems tedious.

Assuming $DataTable being the DataTable in question

What I tried to do so far was:

$Types = $DataTable.Columns | Select-Object -Property DataType
$Columns= $DataTable.Columns | Select-Object -Property ColumnName
$Index = $DataTable.Columns | Select-Object -Property ordinal
$AllowNull  = $DataTable.Columns | Select-Object -Property AllowDbNull

Then painfully going through each array, pick up individual items and put them in my multi-dimensional array $TableMetaData.

I read in the documentation of Select-Object and it seems to me that only 1 property can be selected at 1 time? I think I should be able to do all the above more elegantly and store the information in $TableMetaData.

Is there a way to easily pick up multiple properties and put them in a multi-dimensional array in 1 swoop?

Upvotes: 17

Views: 50535

Answers (2)

Victor Ashiedu
Victor Ashiedu

Reputation: 39

One easy way to do this is to create an "empty" variable with Select-Object. Here is a sample command:

$DataTableReport = "" | Select-Object -Property DataType, ColumnName, ordinal,  AllowDbNull 

Then, link the $DataTableReport to the $Types, $Columns, $Index, and the $AllowNull properties as shown below:

$DataTableReport.Types = $DataTable.DataType
$DataTableReport.Columns = $DataTable.ColumnName 
$DataTableReport.Index = $DataTable.ordinal 
$DataTableReport.AllowNull  = $DataTable.AllowDbNull 

Finally, call the DataTableReport variable.

$DataTableReport # will display all the results in a tabular form.

Upvotes: 3

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174445

I read the documentation of Select-Object and it seems to me that only 1 property can be selected at 1 time?

This is not true, Select-Object can take any number of arguments to the -Property parameter

$ColumnInfo = $DataTable.Columns | Select-Object -Property DataType,ColumnName,ordinal,AllowDbNull

Now $ColumnInfo will contain one object for each column, having all 4 properties.

Rather than using a multi-dimensional array, you should consider using a hashtable (@{}, an unordered dictionary):

$ColumnInfo = $DataTable.Columns | ForEach-Object -Begin { $ht = @{} } -Process {
    $ht[$_.ColumnName] = $_
} -End { return $ht }

Here, we create an empty hashtable $ht (the -Begin block runs just once), then store each column object in $ht using the ColumnName as the key, and finally return $ht, storing it in $ColumnInfo.

Now you can reference metadata about each column by Name:

$ColumnInfo.Column2
# or 
$ColumnInfo["Column2"]

Upvotes: 21

Related Questions