powershell - ¿Cómo se puede probar si un objeto tiene una propiedad específica?
powershell-v3.0 (10)
¿Me gusta esto?
[bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")
¿Cómo se puede probar si un objeto tiene una propiedad específica?
Apreciar que puedo hacer ...
$members = Get-Member -InputObject $myobject
y luego foreach
través de $members
, pero ¿hay una función para probar si el objeto tiene una propiedad específica?
Información adicional: El problema es que estoy importando dos tipos diferentes de archivos CSV, uno con dos columnas y el otro con tres. No pude hacer que el cheque funcionara con "Propiedad", solo con "NoteProperty" ... cualquiera que sea la diferencia
if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) )
Empecé a usar PowerShell con PowerShell Core 6.0 (beta) y lo siguiente simplemente funciona:
if ($members.NoteProperty) {
# NoteProperty exist
}
o
if (-not $members.NoteProperty) {
# NoteProperty does not exist
}
Esto es sucinto y legible:
"MyProperty" -in $MyObject.PSobject.Properties.Name
Podemos ponerlo en una función:
function HasProperty($object, $propertyName)
{
$propertyName -in $object.PSobject.Properties.Name
}
He estado usando lo siguiente que devuelve el valor de la propiedad, ya que se accedería a través de $thing.$prop
, si la "propiedad" existiría y no lanzaría una excepción aleatoria. Si la propiedad "no existe" (o tiene un valor nulo), se devuelve $null
: este enfoque funciona en / es útil para el modo estricto , porque, bueno, voy a atraparlos a todos.
Encuentro este enfoque útil porque permite que los Objetos personalizados PS, los objetos .NET normales, PS HashTables y las colecciones .NET como Dictionary se traten como "equivalente a pato" , que considero que encaja bastante bien con PowerShell.
Por supuesto, esto no cumple con la definición estricta de "tiene una propiedad" ... a la que esta pregunta puede estar explícitamente limitada. Si se acepta aquí la definición más amplia de "propiedad", el método puede modificarse trivialmente para devolver un valor booleano.
Function Get-PropOrNull {
param($thing, [string]$prop)
Try {
$thing.$prop
} Catch {
}
}
Ejemplos:
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"
Y, este comportamiento podría no ser [siempre] deseado ... es decir. no es posible distinguir entre x.Count
y x["Count"]
.
Puedes usar Get-Member
if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}
Real similar a una verificación de javascript:
foreach($member in $members)
{
if($member.PropertyName)
{
Write $member.PropertyName
}
else
{
Write "Nope!"
}
}
Si está utilizando StrictMode y el psobject podría estar vacío, le dará un error.
Para todos los propósitos, esto hará:
if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)
Simplemente verifique nulo.
($myObject.MyProperty -ne $null)
Si no ha configurado PowerShell para StrictMode , esto funciona incluso si la propiedad no existe:
$obj = New-Object PSObject;
Add-Member -InputObject $obj -MemberType NoteProperty -Name Foo -Value "Bar";
$obj.Foo; # Bar
($obj.MyProperty -ne $null); # False, no exception
Solo aclarar dado el siguiente objeto
$Object
Con las siguientes propiedades
type : message
user : [email protected]
text :
ts : 11/21/2016 8:59:30 PM
Los siguientes son verdaderos
$Object.text -eq $NULL
$Object.NotPresent -eq $NULL
-not $Object.text
-not $Object.NotPresent
Por lo tanto, las respuestas anteriores que verifican explícitamente la propiedad por su nombre es la manera más correcta de verificar que esa propiedad no esté presente.
Terminé con la siguiente función ...
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;
}
}