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) )
So was?
[bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")
Sie können Get-Member
verwenden
if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}
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
}
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.
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)
Echt ähnlich wie bei einem Javascriptcheck:
foreach($member in $members)
{
if($member.PropertyName)
{
Write $member.PropertyName
}
else
{
Write "Nope!"
}
}
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
Zur Identifizierung, welche Objekte in einem Array eine Eigenschaft haben
$HasProperty = $ArrayOfObjects | Where-Object {$_.MyProperty}
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;
}
}
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.
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.
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
}