如何获取仅具有填充值的属性?

时间:2017-06-05 12:30:21

标签: powershell quest

如何获取仅具有填充值的属性?

因此,例如,如果我运行

Get-QADUser -Identity "SomeOne" -IncludeAllProperties

输出当然包括..所有属性,包括那些有和没有值的属性。我想要一个只有值的属性列表。一般来说怎么做?

这不限于Quest Cmdlet,我只使用Get-QADUser作为示例。

4 个答案:

答案 0 :(得分:6)

您可以尝试使用名为 PSObject 的PowerShell对象的内置(隐藏)属性,其中包含一个名为属性的属性,即所有属性的列表。父对象。

举个例子可能更容易。取Get-Process ...一个进程可以有许多属性(属性),有或没有值。为了获得具有值的值,您可以这样做:

(Get-Process | Select -First 1).PSObject.Properties | ?{$_.Value -ne $null} | FT Name,Value

请注意,我将此限制为Get-Process返回的第一个进程。然后,我们获取在该对象上定义的所有属性,过滤不为空,然后仅显示这些属性的名称

答案 1 :(得分:6)

补充 Charlie Joynt's helpful answer

下面是便利函数Remove-NullProperties ,它会创建仅使用输入对象的非$null属性填充的输入对象的自定义对象副本。

使用示例:

# 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 $_ }

这产生以下结果 - 注意如何删除相应的空值属性:

one  three
---  -----
r1c1 r1c3 


one  two 
---  --- 
r2c1 r2c2

Remove-NullProperties源代码:

<#
.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
  }

}

答案 2 :(得分:0)

首先使用path获取其属性(因为myFile依赖于AD架构,属性列表是动态的),然后过滤掉其定义中没有Get-QADUser的属性(也就是说,它们不是“gettable”),然后按名称枚举结果列表并过滤掉空值。

get-member -type property

答案 3 :(得分:0)

在从Infoblox csv文件导入对象的情况下,这些答案对我没有用。有些值是空字符串,但不是null。测试一个属性是否真实,对我来说似乎更好。结果是一个对象。

$a = [pscustomobject]@{one='hi';two='';three='there'}
$prop = $a.psobject.Properties | where value | select -expand name
$a | select $prop

one three
--- -----
hi  there