Подтвердить что ты не робот

Как вы можете проверить, имеет ли объект определенное свойство?

Как вы можете проверить, имеет ли объект определенное свойство?

Оцените, что я могу сделать...

$members = Get-Member -InputObject $myobject 

а затем foreach через $members, но есть ли функция для проверки, имеет ли объект определенное свойство?

Дополнительная информация: Проблема в том, что я импортирую два разных файла CSV, один с двумя столбцами, другой с тремя. Я не мог заставить чек работать с "Property", только с "NoteProperty"... независимо от того, какая разница

if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) ) 
4b9b3361

Ответ 1

Как это?

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

Ответ 2

Вы можете использовать Get-Member

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

Ответ 3

Это кратким и читаемым:

"MyProperty" -in $MyObject.PSobject.Properties.Name

Мы можем поставить его в функцию:

function HasProperty($object, $propertyName)
{
    $propertyName -in $object.PSobject.Properties.Name
}

Ответ 4

Я использовал следующее, которое возвращает значение свойства, поскольку оно будет доступно через $thing.$prop, если "свойство" будет существовать, а не выбрасывать случайное исключение. Если свойство "не существует" (или имеет нулевое значение), возвращается значение $null: этот подход работает в/полезен для строгого режима, потому что, ну, Gonna Catch 'em All.

Я нахожу этот подход полезным, потому что он позволяет PS Custom Objects, обычные объекты.NET, PS HashTables и.NET-коллекции, такие как словарь, рассматриваться как "эквивалент утиного типа", который я считаю довольно подходящим для PowerShell.

Конечно, это не соответствует строгому определению "имеет свойство", которое может быть явно ограничено этим вопросом. Если принять более широкое определение "свойство", принятое здесь, метод может быть тривиально модифицирован, чтобы возвращать логическое значение.

Function Get-PropOrNull {
    param($thing, [string]$prop)
    Try {
        $thing.$prop
    } Catch {
    }
}

Примеры:

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"

И это поведение не может [всегда] быть желательным.. т.е. невозможно отличить x.Count и x["Count"].

Ответ 5

Если вы используете StrictMode и psobject может быть пустым, это приведет к ошибке.

Для всех целей это будет делать:

    if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)

Ответ 6

Реальный, похожий на проверку javascript:

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

Ответ 7

Просто установите флажок null.

($myObject.MyProperty -ne $null)

Если у вас нет установить PowerShell в StrictMode, это работает, даже если свойство не существует:

$obj = New-Object PSObject;                                                   
Add-Member -InputObject $obj -MemberType NoteProperty -Name Foo -Value "Bar";
$obj.Foo; # Bar                                                                  
($obj.MyProperty -ne $null);  # False, no exception

Ответ 8

Просто, чтобы уточнить учитывая следующий объект

$Object

Со следующими свойствами

type        : message
user        : [email protected]
text        : 
ts          : 11/21/2016 8:59:30 PM

Верно следующее:

$Object.text -eq $NULL
$Object.NotPresent -eq $NULL

-not $Object.text
-not $Object.NotPresent

Таким образом, более ранние ответы, которые явно проверяют свойство по имени, являются наиболее правильным способом проверки того, что это свойство отсутствует.

Ответ 9

У меня появилась следующая функция...

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

Ответ 10

Недавно я переключился на установку строгого режима -version 2.0, и мои нулевые тесты не удались.

Я добавил функцию:

#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
}

Теперь я код

if (exists $run main) { ...

скорее, чем

if ($run.main -ne $null) { ...

и мы в пути. Кажется, нужно работать с объектами и хэш-таблицами

В качестве непредвиденной выгоды она меньше печатает.

Ответ 11

Для меня "MyProperty" -in $ MyObject.PSobject.Properties.Name не работает, однако $ MyObject.PSobject.Properties.Name.Contains("MyProperty") работает

Ответ 12

Я только начал использовать PowerShell с PowerShell Core 6.0 (бета), и после этого просто работает:

if ($members.NoteProperty) {
   # NoteProperty exist
}

или

if (-not $members.NoteProperty) {
   # NoteProperty does not exist
}

Ответ 13

Вы можете проверить:

($Member.PropertyNames -contains "Name") это будет проверять свойство Named

Ответ 14

Для определения, какой из объектов в массиве имеет свойство

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