Wie können Sie testen, ob ein Objekt eine bestimmte Eigenschaft hat?
Schätzen Sie, dass ich tun kann ...
$members = Get-Member -InputObject $myobject
und dann foreach
durch die $members
, aber gibt es eine Funktion, um zu testen, ob das Objekt eine bestimmte Eigenschaft hat?
Zusätzliche Informationen: Das Problem ist, dass ich zwei verschiedene Arten von CSV-Dateien importiere, eine mit zwei Spalten, die andere mit drei. Ich konnte den Scheck nicht mit "Property" arbeiten lassen, nur mit "NoteProperty" ... was auch immer der Unterschied ist
if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) )
powershell
powershell-3.0
SteveC
quelle
quelle
($object.property -ne $null)
?$null
Wert hatAntworten:
So was?
quelle
$myObject.PSobject.Properties.Name -contains "myPropertyNameToTest"
ist besser. Sie müssen sich keine Gedanken über einen möglichen Mustervergleich machen, und Sie müssen dann auch nicht in Boolean umwandeln.ThisisMyProperty
und Sie danach suchen möchtenMyProperty
? Alle Lösungen in dieser Antwort führen zu einem falsch positiven Ergebnis.Sie können verwenden
Get-Member
quelle
if($var | Get-Member Property){ }
, noch kürzer, aber weniger lesbar:if($var | gm Property){ }
Dies ist kurz und lesbar:
Wir können es in eine Funktion setzen:
quelle
?.
Äquivalent): | Dies wird auch für bestimmte Variationen von$MyObject
, insbesondere $ null, fehlschlagen . Dies war bei der Nullverkettung außerhalb des Strict Mode nicht der Fall.Ich habe Folgendes verwendet, das den Eigenschaftswert zurückgibt, über den zugegriffen werden würde
$thing.$prop
, wenn die "Eigenschaft" existieren und keine zufällige Ausnahme auslösen würde. Wenn die Eigenschaft "nicht existiert" (oder einen Nullwert hat),$null
wird sie zurückgegeben: Dieser Ansatz funktioniert im strengen Modus , da er alle abfangen wird.Ich finde diesen Ansatz nützlich, da damit benutzerdefinierte PS-Objekte, normale .NET-Objekte, PS HashTables und .NET-Sammlungen wie Dictionary als "Enten-Typ-Äquivalent" behandelt werden können , was meiner Meinung nach ziemlich gut zu PowerShell passt.
Dies entspricht natürlich nicht der strengen Definition von "hat eine Eigenschaft", auf die diese Frage ausdrücklich beschränkt sein kann. Wenn die hier angenommene größere Definition von "Eigenschaft" akzeptiert wird, kann die Methode trivial geändert werden, um einen Booleschen Wert zurückzugeben.
Beispiele:
Und dieses Verhalten ist möglicherweise nicht [immer] erwünscht. es ist nicht möglich zwischen
x.Count
und zu unterscheidenx["Count"]
.quelle
Wenn Sie StrictMode verwenden und das psobject möglicherweise leer ist, wird ein Fehler angezeigt.
Für alle Zwecke reicht dies aus:
quelle
Wirklich ähnlich wie bei einer Javascript-Prüfung:
quelle
use strict
.Nur um das folgende Objekt zu verdeutlichen
Mit den folgenden Eigenschaften
Folgendes ist wahr
Die früheren Antworten, die explizit nach der Eigenschaft nach Namen suchen, sind daher die korrekteste Methode, um zu überprüfen, ob diese Eigenschaft nicht vorhanden ist.
quelle
Einfach gegen Null prüfen.
Wenn Sie PowerShell nicht auf StrictMode festgelegt haben , funktioniert dies auch dann, wenn die Eigenschaft nicht vorhanden ist:
quelle
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}
Sie Folgendes aus : und Sie erhalten eine Fehler- Eigenschaft 'StartDate' kann für dieses Objekt nicht gefunden werden. Allerdings muss ich meinen Kommentar qualifizieren - man bekommt es nicht , wenn StrictMode nicht gesetzt ist. Ich habe es immer eingestellt, also erst realisiert, als ich es getestet habe! Dennoch denke ich, dass die meisten Leute 'Set-Strictmode' verwenden (oder verwenden sollten).Bei mir hat es
MyProperty" -in $MyObject.PSobject.Properties.Name
aber nicht geklapptfunktioniert
quelle
Am Ende hatte ich folgende Funktion ...
quelle
Ich habe kürzlich auf Strict-Mode-Version 2.0 umgestellt und meine Null-Tests sind fehlgeschlagen.
Ich habe eine Funktion hinzugefügt:
Jetzt codiere ich
eher, als
und wir sind auf dem Weg. Scheint an Objekten und Hashtabellen zu arbeiten
Als unbeabsichtigter Vorteil ist es weniger tippen.
quelle
Ich habe gerade angefangen, PowerShell mit PowerShell Core 6.0 (Beta) zu verwenden, und Folgendes funktioniert einfach:
oder
quelle
Sie könnten überprüfen mit:
($Member.PropertyNames -contains "Name")
Dadurch wird nach der Named-Eigenschaft gesuchtquelle
Zum Identifizieren, welche der Objekte in einem Array eine Eigenschaft haben
quelle