Ответ 1
Как это?
[bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")
Как вы можете проверить, имеет ли объект определенное свойство?
Оцените, что я могу сделать...
$members = Get-Member -InputObject $myobject
а затем foreach
через $members
, но есть ли функция для проверки, имеет ли объект определенное свойство?
Дополнительная информация: Проблема в том, что я импортирую два разных файла CSV, один с двумя столбцами, другой с тремя. Я не мог заставить чек работать с "Property", только с "NoteProperty"... независимо от того, какая разница
if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) )
Как это?
[bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")
Вы можете использовать Get-Member
if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}
Это кратким и читаемым:
"MyProperty" -in $MyObject.PSobject.Properties.Name
Мы можем поставить его в функцию:
function HasProperty($object, $propertyName)
{
$propertyName -in $object.PSobject.Properties.Name
}
Я использовал следующее, которое возвращает значение свойства, поскольку оно будет доступно через $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"]
.
Если вы используете StrictMode и psobject может быть пустым, это приведет к ошибке.
Для всех целей это будет делать:
if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)
Реальный, похожий на проверку javascript:
foreach($member in $members)
{
if($member.PropertyName)
{
Write $member.PropertyName
}
else
{
Write "Nope!"
}
}
Просто установите флажок 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
Просто, чтобы уточнить учитывая следующий объект
$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
Таким образом, более ранние ответы, которые явно проверяют свойство по имени, являются наиболее правильным способом проверки того, что это свойство отсутствует.
У меня появилась следующая функция...
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;
}
}
Недавно я переключился на установку строгого режима -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) { ...
и мы в пути. Кажется, нужно работать с объектами и хэш-таблицами
В качестве непредвиденной выгоды она меньше печатает.
Для меня "MyProperty" -in $ MyObject.PSobject.Properties.Name не работает, однако $ MyObject.PSobject.Properties.Name.Contains("MyProperty") работает
Я только начал использовать PowerShell с PowerShell Core 6.0 (бета), и после этого просто работает:
if ($members.NoteProperty) {
# NoteProperty exist
}
или
if (-not $members.NoteProperty) {
# NoteProperty does not exist
}
Вы можете проверить:
($Member.PropertyNames -contains "Name")
это будет проверять свойство Named
Для определения, какой из объектов в массиве имеет свойство
$HasProperty = $ArrayOfObjects | Where-Object {$_.MyProperty}