How do I get properties that ONLY have populated values?
How do I get properties that ONLY have populated values?
So, for example, if I run
Get-QADUser -Identity "SomeOne" -IncludeAllProperties
the output, of course, includes all properties, including those that have and those that have no value. I need a list of properties with values. How is this done in general?
This will not be limited to quest commands, I only use Get-QADUser
.
source to share
You can try using a built-in (hidden) property on PowerShell objects called PSObject , which includes a Properties property , which is a list of all properties on the parent object.
Maybe easier with an example. Take Get-Process
... a process can have many attributes (properties) with or without values. To get only the ones that have values, you do this:
(Get-Process | Select -First 1).PSObject.Properties | ?{$_.Value -ne $null} | FT Name,Value
Note that I have limited this to only the first process returned Get-Process
. Then we get all the properties defined on that object and filter where Value is not null, and then display only those Name and Value for those properties.
source to share
To complement Charlie Joynt's helpful answer :
Below is a convenience functionRemove-NullProperties
that creates custom object copies of its input objects populated with only the properties of the $null
input objects.
Usage example:
# Sample input collection, with 2 objects with different $null-valued
# properties.
$coll = [pscustomobject] @{ one = 'r1c1'; two = $null; three = 'r1c3' },
[pscustomobject] @{ one = 'r2c1'; two = 'r2c2'; three = $null }
# Output copies containing only non-$null-valued properties.
# NOTE: The `ForEach-Object { Out-String -InputObject $_ }` part is solely
# there to ensure that *all* resulting properties are shown.
# With the default output, only the properties found on the FIRST
# input object would be used in the output table.
$coll | Remove-NullProperties |
ForEach-Object { Out-String -InputObject $_ }
This yields the following: notice how the corresponding null-value properties have been removed:
one three
--- -----
r1c1 r1c3
one two
--- ---
r2c1 r2c2
Remove-NullProperties
source:
<#
.SYNOPSIS
Removes properties with $null values from custom-object copies of
the input objects.
.DESCRIPTION
Note that output objects are custom objects that are copies of the input
objects with copies of only those input-object properties that are not $null.
CAVEAT: If you pipe multiple objects to this function, and these objects
differ in what properties are non-$null-valued, the default output
format will show only the non-$null-valued properties of the FIRST object.
Use ... | ForEach-Object { Out-String -InputObject $_ } to avoid
this problem.
.NOTES
Since the output objects are generally of a distinct type - [pscustomobject] -
and have only NoteProperty members, use of this function only makes sense
with plain-old data objects as input.
.EXAMPLE
> [pscustomobject] @{ one = 1; two = $null; three = 3 } | Remove-NullProperties
one three
--- -----
1 3
#>
function Remove-NullProperties {
param(
[parameter(Mandatory,ValueFromPipeline)]
[psobject] $InputObject
)
process {
# Create the initially empty output object
$obj = [pscustomobject]::new()
# Loop over all input-object properties.
foreach($prop in $InputObject.psobject.properties) {
# If a property is non-$null, add it to the output object.
if ($null -ne $InputObject.$($prop.Name)) {
Add-Member -InputObject $obj -NotePropertyName $prop.Name -NotePropertyValue $prop.Value
}
}
# Give the output object a type name that reflects the type of the input
# object prefixed with 'NonNull.' - note that this is purely informational, unless
# you define a custom output format for this type name.
$obj.pstypenames.Insert(0, 'NonNull.' + $InputObject.GetType().FullName)
# Output the output object.
$obj
}
}
source to share
First you get your properties (since it Get-QADUser
depends on the AD schema, the property list is dynamic) from get-member -type property
, and then filter out those that are not \{.*(get).*\}
in its definition (that is, they are not "gettable"), then list the resulting list by name and filter out the nulls values.
$someone=Get-QADUser -Identity "SomeOne" -IncludeAllProperties
$members=$someone|get-member -type property| where {$_.definition -match '\{.*(get).*\}'}
foreach ($member in $members) {
if ($someone[$member.name] -ne $null) {
write-host $member.name $someone[$member.name]
}
}
source to share
These answers didn't work for me in case of object import from Infoblox csv file. Some values ββwere empty string, but not null. Checking if a property is true or not seems to work better for me. And the result is an object.
$a = [pscustomobject]@{one='hi';two='';three='there'}
$prop = $a.psobject.Properties | where value | select -expand name
$a | select $prop
one three
--- -----
hi there
source to share