2014-11-18 9 views
38

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

Schätzen ich tun kann ...

$members = Get-Member -InputObject $myobject 

und dann foreach durch die $members, aber gibt es eine Funktion zu testen, ob das Objekt eine bestimmte Eigenschaft hat?

Zusätzliche Informationen: Das Problem ist, ich importiere zwei verschiedene Arten von CSV-Datei, eine mit zwei Spalten, die andere mit drei. Ich konnte die Prüfung mit "Property", nicht an die Arbeit nur mit "Noteproperty" ... was der Unterschied

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

'($ object.property -ne $ null)'? – arco444

+2

Ist es wichtig, ob die Eigenschaft vorhanden ist, aber einen '$ null'-Wert hat? – Matt

Antwort

52

so verwenden?

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

Diese Antwort funktioniert nur für PowerShell v3 oder höher. Folgendes sollte auch mit powerShell v2 und höher funktionieren: [bool] ($ file.psobject.Properties | where {$ _. Name -eq "myPropertyNameToTest"}) – AstralisSomnium

+12

'$ myObject.PSobject.Properties.Name -enthält" myPropertyNameToTest " 'ist besser. Sie müssen sich keine Gedanken über mögliche Musterabgleiche machen, und Sie müssen dann auch nicht auf Boolean umstellen. –

+1

Was ist, wenn das Objekt die Eigenschaft 'ThisisMyProperty' hat und Sie nach' MyProperty' suchen möchten? Alle Lösungen in dieser Antwort führen zu einem falsch positiven Ergebnis. –

2

Echt ähnlich einer Javascript-Check ist:

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

Dies funktioniert möglicherweise nicht, wenn die Eigenschaft tatsächlich den Wert $ null hat. –

+5

Dies schlägt fehl, wenn PowerShell im strikten Modus ist. –

+0

@Iankemp Was ist strikter Modus? Wie die Ausführungsrichtlinie? –

28

Sie kann Get-Member

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

Beste Antwort IMHO. Dies funktioniert mit .NET-Objekten, die kein PSobject-Mitglied haben. Wir können auch die Option -MemberType entfernen, wenn es uns egal ist, welche Art von Member das Objekt enthält - nur der Name des Members. Sehr nützlich mit Invoke-RestMethod- oder ConvertFrom-Json-Objekten! –

0

I mit der folgenden Funktion gelandet ...

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

Überprüfen Sie einfach gegen null.

($myObject.MyProperty -ne $null) 

Wenn Sie nicht set PowerShell to StrictMode haben, das funktioniert auch, wenn die Eigenschaft nicht existiert:

$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

Soweit ich sehen kann, funktioniert dies, wenn die Eigenschaft existiert und $ null ist, aber nicht, wenn die Eigenschaft nicht existiert - der Versuch, darauf zuzugreifen, um die Null-Überprüfung durchzuführen, löst eine Ausnahme aus. – Peter

+0

@Peter Können Sie ein Beispiel für den Null-Check angeben, der eine Ausnahme auslöst, wenn die Eigenschaft nicht existiert. Ich habe ein Beispiel hinzugefügt, in dem eine Eigenschaft nicht existiert und es keine Ausnahme gibt. –

+2

Führen Sie Folgendes aus: '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} 'und Sie erhalten eine Fehlermeldung * Die Eigenschaft 'StartDate' kann für dieses Objekt nicht gefunden werden. ** ** Allerdings ** Ich muss meinen Kommentar qualifizieren - Sie nicht bekomme es nicht wenn Strictmode nicht gesetzt ist. Ich habe es immer eingestellt, also nie realisiert, bis ich es getestet habe! Trotzdem denke ich, dass die meisten Leute "Set-Strictmode" verwenden (oder verwenden sollten). – Peter

0

Nur gegeben das folgende Objekt

$Object 

mit den folgenden Eigenschaften zu klären

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

Die folgenden Bedingungen erfüllt sind

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

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

So sind die früheren Antworten, die für die Eigenschaft mit Namen explizit überprüfen ist die richtige Art und Weise, um sicherzustellen, dass diese Eigenschaft nicht vorhanden ist.

2

Wenn Sie StrictMode verwenden und das PsoBject möglicherweise leer ist, erhalten Sie einen Fehler.

Für alle Zwecke wird dies tun:

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

Ich habe gerade angefangen mit Powershell Powershell Core 6 verwenden.0 (beta) und folgenden einfach funktioniert:

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

oder

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

Ich habe die folgende benutze die den Eigenschaftswert zurückgibt, wie es über $thing.$prop, wenn das die zugegriffen werden würde "property" würde existieren und keine zufällige Ausnahme werfen. Wenn die Eigenschaft "nicht existiert" (oder einen Nullwert hat), dann wird $null zurückgegeben: Dieser Ansatz funktioniert in/ist nützlich für strict mode, weil, nun, Gonna Catch 'em All.

Ich finde diesen Ansatz nützlich, weil es PS Benutzerdefinierte Objekte, normale .NET-Objekte, PS HashTables und .NET-Sammlungen wie Dictionary als „Ente typisierte äquivalent“ behandelt werden kann, die wir finden eine ziemlich gut sind passend für PowerShell.

Natürlich erfüllt dies nicht die strenge Definition von "hat eine Eigenschaft" .. auf die diese Frage explizit beschränkt werden kann. Wenn die hier angenommene Definition von "Eigenschaft" akzeptiert wird, kann die Methode trivial modifiziert werden, um einen booleschen 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 könnte dieses Verhalten nicht [immer] erwünscht sein .. dh. Es ist nicht möglich, zwischen x.Count und x["Count"] zu unterscheiden.

0

Dies ist prägnant und lesbar:

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

Wir es in Funktion setzen können:

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