If you are reading this you must have used PowerShell Select-object in PowerShell to select properties of an object something like

PowerShell Select-Object

Or, Where-Object cmdlet to filter out values on any specific object property like

PowerShell Select-Object

All these work well when you know the Property Name you are searching.

But what if you don’t know the property name and you’re sure that there is a value against some property which you’re searching.

For example, I know in the object of  WMI class Win32_OperatingSystem there is a Property-value pair for Windows operating system name, but what if I don’t know the exact Property name against which this value may be present, then how I’d get the value?

PowerShell Select-Object

The normal approach is to list all the properties and values like in the following

Get-WmiObject win32_OperatingSystem | Select-Object *

Or,

Get-WmiObject win32_OperatingSystem | Format-List *

and then manually scan through the result until you find the Property-Value pair you were looking, so that you can use the property name to get the value next time.

I’ve done this often and I’m sure you’ve experienced this as well, but things get tough when there are more than 100 properties in an object for example in an AD object.

I think there has to be a smarter way to search the values even though, we don’t know the name of the property.

Hence I wrote this quick function Select-Value , which has following capabilities –

  1. You can search a value directly in object properties, without being aware of the property name, the function does all the searching for you.PowerShell Select-Object
  2. It adds the property of the matching value to the default display properties so that you can see Property-Value pair on the console.
  3. Maintains the Object type, and properties so that you can further use it in the pipeline or perform a set of operations.PowerShell Select-Object
  4. Compared to other filtering methods the function performs well, without any significant difference in execution time.PowerShell Select-Object


Function Select-Value{
[Cmdletbinding()]
Param(
[parameter(Mandatory=$true)] [String] $Value,
[parameter(ValueFromPipeline=$true)] $InputObject
)
Process{
# Identify the PropertyName for respective matching Value, in order to populate it Default Properties
$Property = ($PSItem.properties.Where({$_.Value -Like "$Value"})).Name
If($Property){
# Create Property a set which includes the 'DefaultPropertySet' and Property for the respective 'Value' matched
$DefaultPropertySet = $PSItem.PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames
$TypeName = ($PSItem.PSTypenames)[0]
Get-TypeData $TypeName |Remove-TypeData
Update-TypeData -TypeName $TypeName -DefaultDisplayPropertySet ($DefaultPropertySet+$Property |Select-Object -Unique)
# Output Objects
$PSItem | Where-Object {$_.properties.Value -like "$value"}
}
}
}

Add this quick function to your profile and share your feedback.


Add-Content $profile -Value (iwr https://goo.gl/91J8vS); . $Profile

Hoping you’ll find it useful, cheers!

Optical Character Recognition

Subscribe to our mailing list

* indicates required