Comment pouvez-vous tester si un objet a une propriété spécifique?
J'apprécie que je puisse faire ...
$members = Get-Member -InputObject $myobject
puis foreach
à travers le $members
, mais existe-t-il une fonction pour vérifier si l'objet a une propriété spécifique?
Informations supplémentaires: Le problème est que j'importe deux types de fichiers CSV différents, l'un avec deux colonnes, l'autre avec trois. Le chèque ne fonctionnait pas avec "Property", mais avec "NoteProperty" ... quelle que soit la différence entre
if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) )
Comme ça?
[bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")
Vous pouvez utiliser Get-Member
if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}
C'est succinct et lisible:
"MyProperty" -in $MyObject.PSobject.Properties.Name
On peut le mettre dans une fonction:
function HasProperty($object, $propertyName)
{
$propertyName -in $object.PSobject.Properties.Name
}
J'ai utilisé ce qui suit qui renvoie la valeur de la propriété, comme il serait accessible via $thing.$prop
, si la "propriété" devait exister et ne pas lever une exception aléatoire. Si la propriété "n'existe pas" (ou a une valeur nulle), alors $null
est renvoyé: cette approche fonctionne dans/est utile pour mode strict , car, bien, ça va tout intercepter.
Je trouve cette approche utile car elle permet de traiter les objets personnalisés PS, les objets .NET normaux, les tables de hachage PS et les collections .NET telles que Dictionary comme un "équivalent typé", ce qui, à mon avis, convient assez bien. PowerShell.
Bien entendu, cela ne correspond pas à la définition de strict de "a une propriété" .., auquel cette question peut être explicitement limitée. Si vous acceptez la définition plus large de "propriété" supposée ici, la méthode peut être modifiée de manière triviale pour renvoyer un booléen.
Function Get-PropOrNull {
param($thing, [string]$prop)
Try {
$thing.$prop
} Catch {
}
}
Exemples:
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"
Et, ce comportement pourrait ne pas [toujours] être désiré .. c'est-à-dire. il n'est pas possible de faire la distinction entre x.Count
et x["Count"]
.
Si vous utilisez StrictMode et que le psobject est peut-être vide, cela vous donnera une erreur.
À toutes fins utiles, cela fera:
if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)
Vraiment semblable à une vérification javascript:
foreach($member in $members)
{
if($member.PropertyName)
{
Write $member.PropertyName
}
else
{
Write "Nope!"
}
}
Il suffit de vérifier contre null.
($myObject.MyProperty -ne $null)
Si vous n'avez pas défini PowerShell sur StrictMode , cela fonctionne même si la propriété n'existe pas:
$obj = New-Object PSObject;
Add-Member -InputObject $obj -MemberType NoteProperty -Name Foo -Value "Bar";
$obj.Foo; # Bar
($obj.MyProperty -ne $null); # False, no exception
Pour identifier les objets d'un tableau ayant une propriété
$HasProperty = $ArrayOfObjects | Where-Object {$_.MyProperty}
J'ai fini avec la fonction suivante ...
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;
}
}
Je suis récemment passé au mode strict -version 2.0 et mes tests null ont échoué.
J'ai ajouté une fonction:
#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
}
Maintenant je code
if (exists $run main) { ...
plutôt que
if ($run.main -ne $null) { ...
et nous sommes sur notre chemin. Semble travailler sur des objets et des hashtables
En tant que bénéfice non voulu, vous réduisez le temps de frappe.
Juste pour clarifier Étant donné l'objet suivant
$Object
Avec les propriétés suivantes
type : message
user : [email protected]
text :
ts : 11/21/2016 8:59:30 PM
Ce qui suit est vrai
$Object.text -eq $NULL
$Object.NotPresent -eq $NULL
-not $Object.text
-not $Object.NotPresent
Ainsi, les réponses précédentes qui vérifient explicitement la propriété par son nom constituent le moyen le plus correct de vérifier que cette propriété n'est pas présente.
Je viens de commencer à utiliser PowerShell avec PowerShell Core 6.0 (version bêta) et voici comment ça marche:
if ($members.NoteProperty) {
# NoteProperty exist
}
ou
if (-not $members.NoteProperty) {
# NoteProperty does not exist
}