如何测试对象是否具有特定属性?


93

如何测试对象是否具有特定属性?

赞赏我能做的...

$members = Get-Member -InputObject $myobject 

然后foreach通过$members,但是是否有功能测试对象是否具有特定属性?

附加信息: 问题是我要导入两种不同类型的CSV文件,一种包含两列,另一种包含三列。我无法使用“属性”检查支票,只能使用“ NoteProperty” ...不管有什么区别

if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) ) 

6
($object.property -ne $null)
arco444

2
财产是否确实存在但具有$null价值是否重要
Matt

1
@ arco444 nope-要求该属性存在才能使其成功。-如果您有动态数据(即来自Web请求的动态数据),其中某些行甚至没有指定该属性,则该检查将失败。:(
BrainSlugs83 '18

Answers:


103

像这样?

 [bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")

16
此答案仅适用于powerShell v3或更高版本。即使在powerShell v2及更高版本中,以下命令也应起作用:[bool]($ file.psobject.Properties |其中{$ _。Name -eq“ myPropertyNameToTest”})
Patrick

33
$myObject.PSobject.Properties.Name -contains "myPropertyNameToTest"更好。无需担心可能的模式匹配,然后也无需转换为布尔值。
培根片

2
如果对象具有属性ThisisMyProperty并且您要检查该怎么办MyProperty怎么办?此答案中的所有解决方案都将导致误报。
佐尔坦陶马希

3
@KolobCanyon在严格模式下将不起作用。
user2864740 '02

1
例如,如果您在测试“ Count”且对象具有名为“ ThingCount”的属性时,此代码将给出错误肯定的结果。
dan-gph

71

您可以使用 Get-Member

if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}

12
最佳答案恕我直言。这适用于没有PSobject成员的.NET对象。如果我们不在乎对象包含哪种类型的成员,也可以删除-Membertype选项-仅成员名称。对于Invoke-RestMethod或ConvertFrom-Json对象非常有用!
Mister_Tom '17

2
不检查类型的简短语法:if($var | Get-Member Property){ },甚至更短,但可读性更差:if($var | gm Property){ }
zett42 '19

我认为这是最好的答案。
Kiran Hegde

25

这是简洁易读的:

"MyProperty" -in $MyObject.PSobject.Properties.Name

我们可以将其放在一个函数中:

function HasProperty($object, $propertyName)
{
    $propertyName -in $object.PSobject.Properties.Name
}

我喜欢这个答案,但是在CB的答案确实有用的情况下,它似乎不起作用。
埃德温

或者,其中“ succinct” =“通过严格模式引入的不需要的垃圾,没有很好的后备使用情况”(即,没有?.等效项):| 对于的某些变体($MyObject尤其是$ null),这也将失败。严格模式之外的空链接不是这种情况。
user2864740

5

我一直在使用下面的方法来返回属性值,因为$thing.$prop如果存在“属性”并且不会引发随机异常,则可以通过进行访问。如果属性“不存在”(或具有空值),则$null返回:此方法在严格模式下起作用,/对严格模式有用,因为,好吧,他们会抓住一切。

我发现这种方法很有用,因为它允许PS自定义对象,普通.NET对象,PS HashTables和.NET集合(例如Dictionary)被视为“鸭式等效项”,我发现它非常适合PowerShell。

当然,这不符合“具有财产”的严格定义。这个问题可能明确地局限于此。如果接受此处假定的“属性”的较大定义,则可以对方法进行简单修改以返回布尔值。

Function Get-PropOrNull {
    param($thing, [string]$prop)
    Try {
        $thing.$prop
    } Catch {
    }
}

例子:

Get-PropOrNull (Get-Date) "Date"                   # => Monday, February 05, 2018 12:00:00 AM
Get-PropOrNull (Get-Date) "flub"                   # => $null
Get-PropOrNull (@{x="HashTable"}) "x"              # => "HashTable"
Get-PropOrNull ([PSCustomObject]@{x="Custom"}) "x" # => "Custom"
$oldDict = New-Object "System.Collections.HashTable"
$oldDict["x"] = "OldDict"
Get-PropOrNull $d "x"                              # => "OldDict"

并且,这种行为可能[总是]不希望的。无法区分x.Countx["Count"]


3

对我来说MyProperty" -in $MyObject.PSobject.Properties.Name没用,但是

$MyObject.PSobject.Properties.Name.Contains("MyProperty")

作品


2

如果您使用的是StrictMode,而psobject可能为空,则会出现错误。

出于所有目的,这将做到:

    if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)

1

真正类似于javascript检查:

foreach($member in $members)
{
    if($member.PropertyName)
    {
        Write $member.PropertyName
    }
    else
    {
        Write "Nope!"
    }
}

1
如果该属性实际上具有值$ null,则此方法可能不起作用。
Tola Odejayi

8
如果PowerShell处于严格模式,则此操作将失败。
伊恩·坎普

@IanKemp什么是严格模式?喜欢执行政策?
Kolob峡谷

1
@KolobCanyon docs.microsoft.com/zh-cn/powershell/module / ...-本质上,它是PS,等同于JavaScript的PS use strict
伊恩·肯普

1
如果该属性存在,并且设置为$ false,这也将不起作用。

1

只是为了澄清给定以下对象

$Object

具有以下特性

type        : message
user        : john.doe@company.com
text        : 
ts          : 11/21/2016 8:59:30 PM

以下为真

$Object.text -eq $NULL
$Object.NotPresent -eq $NULL

-not $Object.text
-not $Object.NotPresent

因此,通过名称明确检查属性的较早答案是验证该属性不存在的最正确方法。


1

只是检查为空。

($myObject.MyProperty -ne $null)

如果您尚未将PowerShell设置为StrictMode,即使该属性不存在,此方法也可以工作:

$obj = New-Object PSObject;                                                   
Add-Member -InputObject $obj -MemberType NoteProperty -Name Foo -Value "Bar";
$obj.Foo; # Bar                                                                  
($obj.MyProperty -ne $null);  # False, no exception

2
据我所知,如果该属性存在且为$ null,则此方法有效,但如果该属性不存在则不起作用-尝试访问它以执行null检查会引发异常。
彼得

@Peter您能提供一个在属性不存在时引发异常的空检查示例吗?我添加了一个示例,其中属性不存在,也不例外。
Shaun Luttin

2
运行此:Set-Strictmode -version Latest;$obj = ConvertFrom-Json -InputObject '{"name":"test", "version":"1.1.0"}';If($obj.StartDate -ne $null){Write-Verbose -Message $obj.startDate -Verbose}您将收到错误消息,在此对象上找不到属性'StartDate'。 但是,我需要对我的评论进行限定-如果未设置Strictmode,则您不会获得它。我总是设置好它,所以直到我对此进行测试之前才意识到!不过,我认为大多数人都使用(或应该使用)“ Set-Strictmode”。
彼得

2
如果您的答案合格,可能是最好的选择,我会删除我的否决票吗?每个人都学到了一些东西,这就是重点:-)
彼得

0

我最终获得了以下功能...

function HasNoteProperty(
    [object]$testObject,
    [string]$propertyName
)
{
    $members = Get-Member -InputObject $testObject 
    if ($members -ne $null -and $members.count -gt 0) 
    { 
        foreach($member in $members) 
        { 
            if ( ($member.MemberType -eq "NoteProperty" )  -and `
                 ($member.Name       -eq $propertyName) ) 
            { 
                return $true 
            } 
        } 
        return $false 
    } 
    else 
    { 
        return $false; 
    }
}

0

我最近切换到设置严格模式-version 2.0,并且我的null测试失败。

我添加了一个功能:

#use in strict mode to validate property exists before using
function exists {
  param($obj,$prop)
  try {
    if ($null -ne $obj[$prop]) {return $true}
    return $false
  } catch {
    return $false
  }
  return $false
}

现在我编码

if (exists $run main) { ...

而不是

if ($run.main -ne $null) { ...

而我们正在前进。似乎可以处理对象和哈希表

作为意外的好处,它减少了键入。


对于null或空,我一直使用: IF([string] :: IsNullOrEmpty($ userID)){write-host“ Null or empty”}

-1

我刚刚开始将PowerShell与PowerShell Core 6.0(测试版)一起使用,并且以下操作很简单:

if ($members.NoteProperty) {
   # NoteProperty exist
}

要么

if (-not $members.NoteProperty) {
   # NoteProperty does not exist
}

1
不使用严格模式
卡斯珀·莱昂·尼尔森


-1

用于识别数组中的哪些对象具有属性

$HasProperty = $ArrayOfObjects | Where-Object {$_.MyProperty}

如果该属性不存在,则在StrictMode中失败。
user2864740
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.