web-dev-qa-db-fra.com

Comment pouvez-vous tester si un objet a une propriété spécifique?

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) ) 
55
SteveC

Comme ça?

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

Vous pouvez utiliser Get-Member

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

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
}
11
dan-gph

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"].

3
user2864740

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)
2
Ádám Kovács

Vraiment semblable à une vérification javascript:

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

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
1
Shaun Luttin

Pour identifier les objets d'un tableau ayant une propriété

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

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; 
    }
}
0
SteveC

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.

0
Steve Pritchard

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. 

0
John Mello

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
}
0
hshib