web-dev-qa-db-ja.com

オブジェクトに特定のプロパティがあるかどうかをテストするにはどうすればよいですか?

オブジェクトに特定のプロパティがあるかどうかをテストするにはどうすればよいですか?

感謝します...

$members = Get-Member -InputObject $myobject 

foreachを介して$membersを使用しますが、オブジェクトに特定のプロパティがあるかどうかをテストする関数はありますか?

追加情報:問題は、2つの異なる種類のCSVファイルをインポートすることです。1つは2列、もう1つは3列です。 「NoteProperty」でのみ「Property」で動作するようにチェックを取得できませんでした...違いが何であれ

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

このような?

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

Get-Memberを使用できます

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

これは簡潔で読みやすいです:

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

関数に入れることができます:

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

「プロパティ」が存在し、ランダムな例外をスローしない場合は、$thing.$propを介してアクセスされるため、がプロパティ値を返す以下を使用しています。プロパティが「存在しない」(またはnull値を持つ)場合、$nullが返されます。このアプローチは、strict modeで機能します。

_/PSカスタムオブジェクト、通常の.NETオブジェクト、PS HashTables、およびディクショナリなどの.NETコレクションを「ダック型の同等物」として扱うことができるため、このアプローチは便利です。パワーシェル。

もちろん、これは「プロパティを持っている」というstrict定義を満たしていません。この質問は明示的に制限されているかもしれません。ここで想定されている「プロパティ」のより大きな定義を受け入れる場合、ブール値を返すようにメソッドを簡単に変更できます。

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"]を区別することはできません。

4
user2864740

StrictModeを使用していて、psobjectが空の場合、エラーが発生します。

すべての目的で、これは次のことを行います。

    if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)
2
Ádám Kovács

Nullをチェックするだけです。

($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
1
Shaun Luttin

Javascriptチェックに類似した実際:

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

次のオブジェクトを与えて明確にするために

$Object

次のプロパティを持つ

type        : message
user        : [email protected]
text        : 
ts          : 11/21/2016 8:59:30 PM

以下は真実です

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

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

したがって、プロパティを名前で明示的にチェックする以前の回答は、そのプロパティが存在しないことを確認する最も正しい方法です。

1
John Mello

配列内のどのオブジェクトにプロパティがあるかを識別するため

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

私は次の機能になりました...

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
SteveC

最近、厳格モード-バージョン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) { ...

そして、私たちは道を進んでいます。オブジェクトとハッシュテーブルで動作するようです

意図しない利点として、タイピングが少なくなります。

0
Steve Pritchard

PowerShell Core 6.0(ベータ版)でPowerShellを使用し始めたところ、次のように動作します。

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

または

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