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

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

할 수있어 감사합니다 …

$members = Get-Member -InputObject $myobject

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

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

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



답변

이렇게?

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


답변

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

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


답변

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

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

함수에 넣을 수 있습니다.

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


답변

“속성”이 존재하고 임의의 예외를 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"].


답변

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

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

공장


답변

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

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

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


답변

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

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