Como você pode testar se um objeto tem uma propriedade específica?
Agradeço o que posso fazer ...
$members = Get-Member -InputObject $myobject
e depois foreach
através do $members
, mas há uma função para testar se o objeto tem uma propriedade específica?
Informações adicionais: o problema é que estou importando dois tipos diferentes de arquivo CSV, um com duas colunas e outro com três. Não consegui fazer o cheque funcionar com "Property", apenas com "NoteProperty" ... seja qual for a diferença
if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) )
powershell
powershell-3.0
SteveC
fonte
fonte
($object.property -ne $null)
?$null
valorRespostas:
Como isso?
fonte
$myObject.PSobject.Properties.Name -contains "myPropertyNameToTest"
é melhor. Não há necessidade de se preocupar com a possível correspondência de padrões, e você também não precisará converter para Booleano.ThisisMyProperty
e você quiser verificarMyProperty
? Todas as soluções nesta resposta resultarão em um falso positivo.Você pode usar
Get-Member
fonte
if($var | Get-Member Property){ }
if($var | gm Property){ }
Isso é sucinto e legível:
Podemos colocá-lo em uma função:
fonte
?.
equivalente): | Isso também falhará para certas variações de$MyObject
, notavelmente $ null. Esse não era o caso com o encadeamento nulo fora do Modo estrito.Eu tenho usado o seguinte que retorna o valor da propriedade, como seria acessado via
$thing.$prop
, se a "propriedade" existir e não lançar uma exceção aleatória. Se a propriedade "não existe" (ou tem um valor nulo), então$null
é retornado: esta abordagem funciona em / é útil para o modo estrito , porque, bem, vou pegar todos.Acho essa abordagem útil porque permite que Objetos personalizados PS, objetos .NET normais, HashTables PS e coleções .NET como o Dicionário sejam tratados como "equivalente digitado em pato" , que considero um ajuste bastante adequado para PowerShell.
Claro, isso não atende à definição estrita de "tem uma propriedade" .. à qual esta questão pode ser explicitamente limitada. Se aceitar a definição mais ampla de "propriedade" assumida aqui, o método pode ser modificado trivialmente para retornar um booleano.
Exemplos:
E, este comportamento pode não ser [sempre] desejado .. ie. não é possível distinguir entre
x.Count
ex["Count"]
.fonte
Se você estiver usando StrictMode e o psobject estiver vazio, ocorrerá um erro.
Para todos os efeitos, isso fará:
fonte
Para mim
MyProperty" -in $MyObject.PSobject.Properties.Name
não funcionou, no entantotrabalho
fonte
Realmente semelhante a uma verificação de javascript:
fonte
use strict
.Só para esclarecer dado o seguinte objeto
Com as seguintes propriedades
O seguinte é verdadeiro
Portanto, as respostas anteriores que verificam explicitamente a propriedade pelo nome são a maneira mais correta de verificar se essa propriedade não está presente.
fonte
Basta verificar em relação a null.
Se você não definiu PowerShell como StrictMode , isso funcionará mesmo se a propriedade não existir:
fonte
Set-Strictmode -version Latest;$obj = ConvertFrom-Json -InputObject '{"name":"test", "version":"1.1.0"}';If($obj.StartDate -ne $null){Write-Verbose -Message $obj.startDate -Verbose}
e você obterá um erro A propriedade 'StartDate' não pode ser encontrada neste objeto. No entanto , preciso qualificar meu comentário - você não entenderá se Strictmode não estiver definido. Eu sempre tenho definido, então nunca percebi até que eu testei para isso! Ainda assim, acho que a maioria das pessoas usa (ou deveria usar) 'Set-Strictmode'.Acabei com a seguinte função ...
fonte
Recentemente, mudei para definir o modo estrito - versão 2.0 e meus testes nulos falharam.
Eu adicionei uma função:
Agora eu codifico
ao invés de
e estamos a caminho. Parece funcionar em objetos e hashtables
Como um benefício indesejado, é menos digitação.
fonte
Acabei de começar a usar o PowerShell com PowerShell Core 6.0 (beta) e o seguinte simplesmente funciona:
ou
fonte
Você pode verificar com:
($Member.PropertyNames -contains "Name")
isso irá verificar a propriedade nomeadafonte
Para identificar quais objetos em uma matriz têm uma propriedade
fonte