객체에 특정 속성이 있는지 어떻게 테스트 할 수 있습니까?


96

객체에 특정 속성이 있는지 어떻게 테스트 할 수 있습니까?

할 수있어 감사합니다 ...

$members = Get-Member -InputObject $myobject 

다음을 foreach통해$members 객체에 특정 속성이 있는지 테스트하는 기능이 있습니까?

추가 정보 : 문제는 두 가지 종류의 CSV 파일을 가져 오는 것입니다. 하나에는 두 개의 열이 있고 다른 하나에는 세 개의 열이 있습니다. 나는 "Property"와 함께 작동하는 수표를 얻을 수 없었고, "NoteProperty"에서만 ... 차이가 무엇이든간에

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

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

2
때에 프로퍼티가 존재를 수행하지만,이 경우 중요합니까 $null
매트

2
@ arco444 nope-성공하려면 속성이 있어야합니다. -일부 행이 해당 속성을 지정하지 않는 동적 데이터 (예 : 웹 요청)가있는 경우 해당 검사가 실패합니다. :(
BrainSlugs83

답변:


106

이렇게?

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

16
이 답변은 powerShell v3 이상에서만 작동합니다. 다음은 powerShell v2 이상에서도 작동합니다. [bool] ($ file.psobject.Properties | where {$ _. Name -eq "myPropertyNameToTest"})
Patrick

35
$myObject.PSobject.Properties.Name -contains "myPropertyNameToTest"더 나은. 가능한 패턴 일치에 대해 걱정할 필요가 없으며 Boolean으로 캐스트 할 필요도 없습니다.
Bacon Bits

2
객체에 속성이 ThisisMyProperty있고 확인하려면 MyProperty어떻게해야합니까? 이 답변의 모든 솔루션은 오 탐지 결과를 초래합니다.
Zoltán Tamási

3
@KolobCanyon Strict 모드에서는 작동하지 않습니다.
user2864740

1
예를 들어 "Count"를 테스트하고 개체에 "ThingCount"라는 속성이있는 경우이 코드는 오 탐지를 제공합니다.
dan-gph

73

당신이 사용할 수있는 Get-Member

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

12
최고의 답변 IMHO. 이것은 PSobject 구성원이없는 .NET 개체에서 작동합니다. 객체에 어떤 유형의 멤버가 포함되어 있는지 상관하지 않는 경우 -Membertype 옵션을 제거 할 수도 있습니다 (멤버 이름 만). Invoke-RestMethod 또는 ConvertFrom-Json 객체에 매우 유용합니다!
Mister_Tom

2
유형을 확인하지 않는 짧은 구문 : if($var | Get-Member Property){ }, 더 짧지 만 가독성이 if($var | gm Property){ }
떨어짐

이것은 제 생각에 가장 좋은 대답입니다.
Kiran Hegde

26

이것은 간결하고 읽기 쉽습니다.

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

함수에 넣을 수 있습니다.

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

나는이 대답을 좋아하지만 CB의 대답이 작동하는 경우에는 작동하지 않는 것 같습니다.
edwin

또는, "succinct"= "좋은 폴백 사용 사례없이 엄격 모드를 통해 도입 된 불필요한 정크"(즉, ?.동등한 사용 사례 없음 ) : | 이것은 $MyObject특히 $ null 의 특정 변형에 대해서도 실패합니다 . Strict Mode 외부의 null-chaining은 그렇지 않았습니다.
user2864740

5

"속성"이 존재하고 임의의 예외를 throw하지 않는 경우 를 통해 액세스 할 수 있으므로 속성 값$thing.$prop반환 하는 다음을 사용하고 있습니다 . 속성이 "존재하지 않음"(또는 null 값이 있음)이면 $null반환됩니다.이 접근 방식은 엄격 모드 에서 작동 / 유용 합니다 . 왜냐하면 Gonna Catch 'em All.

이 접근 방식 은 PS Custom Objects, 일반 .NET 개체, PS HashTables 및 Dictionary와 같은 .NET 컬렉션을 "duck-typed equivalent"로 취급 할 수 있기 때문에 유용 하며 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.Count과 를 구별 할 수 없습니다 x["Count"].


속성을 가져 오거나 $null추가 기능없이 : $x = try{ $someObject.someProp } catch{ $null }. 블록 $null에서 생략 할 수 catch있지만 IMO는 가독성을 향상시킵니다.
zett42

4

MyProperty" -in $MyObject.PSobject.Properties.Name그러나 나를 위해 작동하지 않았습니다.

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

공장


2

StrictMode를 사용 중이고 psobject가 비어있는 경우 오류가 발생합니다.

모든 목적을 위해 다음을 수행합니다.

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

1

자바 스크립트 검사와 진짜 비슷합니다.

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

1
속성에 실제로 $ null 값이 있으면 작동하지 않을 수 있습니다.
Tola Odejayi

8
PowerShell이 ​​엄격 모드 인 경우 실패합니다.
Ian Kemp

@IanKemp 엄격 모드 란 무엇입니까? 실행 정책처럼?
Kolob Canyon

1
@KolobCanyon docs.microsoft.com/en-za/powershell/module/…- 기본적으로 JavaScript의 use strict.
Ian Kemp

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

null을 확인하십시오.

($myObject.MyProperty -ne $null)

당신이하지 않은 경우 StrictMode로 PowerShell을 설정 속성이 존재하지 않는 경우에도,이 작품 :

$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 속성이 존재하지 않을 때 예외를 발생시키는 null 검사의 예를 제공 할 수 있습니까? 속성이 존재하지 않고 예외가없는 예를 추가했습니다.
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'를 사용하거나 사용해야한다고 생각합니다.
Peter

2
당신이 당신의 대답을 인정한다면 아마도 최선일 것입니다. 그리고 제가 내 반대표를 제거 할 것입니까? 모두가 뭔가를 배웠습니다. 요점입니다 :-)
Peter

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

최근에 엄격 모드 버전 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"}

0

다른 곳에서 작동하는 코드를 디버깅하는 데 몇 시간을 보냈기 때문에 토론에 추가하고 싶었습니다.

의해 답변을 CB. 변수를 속성 이름 (문자열)과 일치시키는 데 적합합니다. 변수 가 속성 이름 의 일부 와 일치 할 때 문제가 시작되었습니다 .

if([bool]($allFiles.PSobject.Properties.name -match $_.Name) -ne $true){

나중에 객체의 속성을 참조하는 데 사용했지만 다른 속성의 일부와 만 일치하므로 정확한 이름을 가진 실제 속성이 존재하지 않았으므로 작업에서 'null'값을 반환했습니다.

나중에 야 dan-gph가 제안한 솔루션을 사용 했는데 매우 깔끔합니다.

if([bool]($_.Name -in $allFiles.PSobject.Properties.Name) -ne $true){

이것은 두 값이 동일하다는 것을 확인했습니다 . 나는 어디를 봐야할지 알았지 만 여전히 문제가 2 자의 문자열과 일치하는 여러 이름이라는 것을 알아내는 것도 고통 스러웠습니다. 접두사이지만 그렇지 않으면 동일합니다.


-1

방금 PowerShell Core 6.0 (베타)과 함께 PowerShell을 사용하기 시작했으며 다음과 같이 간단히 작동합니다.

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

또는

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

1
하지에 strictmode와
캐스퍼 레온 닐슨

-1

다음으로 확인할 수 있습니다.

($Member.PropertyNames -contains "Name") Named 속성을 확인합니다.


-1

속성이있는 배열의 객체 식별

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

속성이없는 경우 StrictMode에서 실패합니다.
user2864740
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.