123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #######################
- function Get-Type
- {
- param($type)
- $types = @(
- 'System.Boolean',
- 'System.Byte[]',
- 'System.Byte',
- 'System.Char',
- 'System.Datetime',
- 'System.Decimal',
- 'System.Double',
- 'System.Guid',
- 'System.Int16',
- 'System.Int32',
- 'System.Int64',
- 'System.Single',
- 'System.UInt16',
- 'System.UInt32',
- 'System.UInt64')
- if ( $types -contains $type ) {
- Write-Output "$type"
- }
- else {
- Write-Output 'System.String'
-
- }
- } #Get-Type
- #######################
- <#
- .SYNOPSIS
- Creates a DataTable for an object
- .DESCRIPTION
- Creates a DataTable based on an objects properties.
- .INPUTS
- Object
- Any object can be piped to Out-DataTable
- .OUTPUTS
- System.Data.DataTable
- .EXAMPLE
- $dt = Get-psdrive| Out-DataTable
- This example creates a DataTable from the properties of Get-psdrive and assigns output to $dt variable
- .NOTES
- Adapted from script by Marc van Orsouw see link
- Version History
- v1.0 - Chad Miller - Initial Release
- v1.1 - Chad Miller - Fixed Issue with Properties
- v1.2 - Chad Miller - Added setting column datatype by property as suggested by emp0
- v1.3 - Chad Miller - Corrected issue with setting datatype on empty properties
- v1.4 - Chad Miller - Corrected issue with DBNull
- v1.5 - Chad Miller - Updated example
- v1.6 - Chad Miller - Added column datatype logic with default to string
- v1.7 - Chad Miller - Fixed issue with IsArray
- .LINK
- http://thepowershellguy.com/blogs/posh/archive/2007/01/21/powershell-gui-scripblock-monitor-script.aspx
- #>
- function Out-DataTable
- {
- [CmdletBinding()]
- param([Parameter(Position=0, Mandatory=$true, ValueFromPipeline = $true)] [PSObject[]]$InputObject)
- Begin
- {
- $dt = new-object Data.datatable
- $First = $true
- }
- Process
- {
- foreach ($object in $InputObject)
- {
- $DR = $DT.NewRow()
- foreach($property in $object.PsObject.get_properties())
- {
- if ($first)
- {
- $Col = new-object Data.DataColumn
- $Col.ColumnName = $property.Name.ToString()
- if ($property.value)
- {
- if ($property.value -isnot [System.DBNull]) {
- $Col.DataType = [System.Type]::GetType("$(Get-Type $property.TypeNameOfValue)")
- }
- }
- $DT.Columns.Add($Col)
- }
- if ($property.Gettype().IsArray) {
- $DR.Item($property.Name) =$property.value | ConvertTo-XML -AS String -NoTypeInformation -Depth 1
- }
- else {
- $DR.Item($property.Name) = $property.value
- }
- }
- $DT.Rows.Add($DR)
- $First = $false
- }
- }
-
- End
- {
- Write-Output @(,($dt))
- }
- } #Out-DataTable
|