it-swarm.com.de

Wie können Sie testen, ob ein Objekt eine bestimmte Eigenschaft hat?

Wie können Sie testen, ob ein Objekt eine bestimmte Eigenschaft hat?

Ich schätze, ich kann ...

$members = Get-Member -InputObject $myobject 

und dann foreach durch $members, aber gibt es eine Funktion zum Testen, ob das Objekt eine bestimmte Eigenschaft hat?

Zusätzliche Info: .__ Das Problem ist, ich importiere zwei verschiedene Arten von CSV-Dateien, eine mit zwei Spalten, die andere mit drei. Ich konnte den Scheck nicht mit "Property" bearbeiten, nur mit "NoteProperty" ... was auch immer der Unterschied ist

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

So was?

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

Sie können Get-Member verwenden

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

Das ist knapp und lesbar:

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

Wir können es in eine Funktion setzen:

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

Ich habe folgendes verwendet, wobei den Eigenschaftswert zurückgibt, da über $thing.$prop darauf zugegriffen werden würde, wenn die "Eigenschaft" existieren würde und keine zufällige Ausnahme auslösen würde. Wenn die Eigenschaft "nicht vorhanden" ist (oder einen Nullwert aufweist), wird $null zurückgegeben: Dieser Ansatz funktioniert in/für strikter Modus, da Gonna Catch 'em All.

Ich finde diesen Ansatz nützlich, weil er es ermöglicht, benutzerdefinierte Objekte, normale .NET-Objekte, PS-HashTables und .NET-Sammlungen wie Dictionary als "Ente-typisches Äquivalent" zu behandeln, was meiner Meinung nach ziemlich gut passt Power Shell.

Natürlich entspricht dies nicht der strict -Definition von "hat eine Eigenschaft" .. auf die diese Frage ausdrücklich beschränkt sein kann. Wenn Sie die hier angenommene größere Definition von "property" akzeptieren, kann die Methode trivial geändert werden, um einen Boolean-Wert zurückzugeben.

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

Beispiele:

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"

Und dieses Verhalten ist möglicherweise nicht immer erwünscht. Es ist nicht möglich, zwischen x.Count und x["Count"] zu unterscheiden.

3
user2864740

Wenn Sie StrictMode verwenden und das psobject möglicherweise leer ist, wird ein Fehler angezeigt.

Für alle Zwecke wird dies Folgendes tun: 

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

Echt ähnlich wie bei einem Javascriptcheck:

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

Einfach gegen null prüfen. 

($myObject.MyProperty -ne $null)

Wenn Sie nicht PowerShell auf StrictMode setzen festgelegt haben, funktioniert dies auch, wenn die Eigenschaft nicht vorhanden ist: 

$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

Zur Identifizierung, welche Objekte in einem Array eine Eigenschaft haben

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

Ich endete mit der folgenden Funktion ...

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

Ich habe vor kurzem auf Strikte-Modus-Version 2.0 umgestellt und meine Nulltests sind fehlgeschlagen.

Ich habe eine Funktion hinzugefügt:

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

Jetzt codiere ich

if (exists $run main) { ...

eher, als

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

und wir sind unterwegs. Scheint an Objekten und Hashtabellen zu arbeiten

Ein unbeabsichtigter Vorteil ist weniger Tippen.

0
Steve Pritchard

Nur zur Verdeutlichung des folgenden Objekts

$Object

Mit den folgenden Eigenschaften

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

Folgendes ist wahr

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

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

Die früheren Antworten, die explizit nach der Eigenschaft anhand des Namens suchen, sind daher der beste Weg, um zu überprüfen, ob diese Eigenschaft nicht vorhanden ist. 

0
John Mello

Ich habe gerade angefangen, PowerShell mit PowerShell Core 6.0 (Beta) zu verwenden, und folgendes funktioniert einfach:

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

oder

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