Determine os atributos filtráveis do objeto Powershell retornado

4

Muitas vezes, quando estou fazendo scripts, estarei testando um comando, mas quero filtrar os resultados. Para descobrir o que posso filtrar, preciso saber quais atributos filtráveis estarão disponíveis.

Por exemplo, quero obter uma lista de recursos instalados, mas preciso filtrar apenas por instalados. O Get-InstalledFeature CMDlet não possui um sinalizador de tipo -InstalledOnly , portanto, preciso filtrar os resultados. Para descobrir o que eu posso filtrar eu farei algo como

(Get-InstalledFeature)[0] | fl

ou

Get-InstalledFeature | Select -First 1 | fl

e descobrirá que posso (intuitivamente, devo dizer) filtrar em Installed . O comando resultante é

Get-InstalledFeature | ?  { $_.Installed }

Existe uma maneira mais fácil de descobrir as propriedades filtráveis? Ou talvez eu pudesse estar trabalhando de forma diferente? Ou talvez eu deva calar a boca e ficar feliz por já ser tão fácil!

Get-Help não ajuda neste caso, pois não me diz o que vou receber de volta.

    
por john 05.08.2013 / 21:42

2 respostas

3

Certamente, é para isso que o Get-Member é

<object> | Get-Member -MemberType Property

... ou estou perdendo o ponto?

    
por 05.08.2013 / 22:42
3

Some-CmdLet | Select * | Select -First 1

Fornecerá a você todas as propriedades do primeiro objeto retornado pelo Cmdlet, mas não necessariamente todas as propriedades que os objetos retornados pelo Cmdlet são capazes de conter.

Muitos, se não a maioria dos Cmdlets, retornam objetos dinâmicos, onde uma propriedade simplesmente não existirá (ao contrário da propriedade existente, mas com um valor nulo ou em branco) se essa propriedade não for preenchida em qualquer provedor do qual os dados sejam recuperados.

Edit2: Além disso, você pode tentar algo assim:

PS C:\> ForEach($P In $(Get-ADUser ryan -Properties *).PSObject.Properties) { $P.Name }
AccountExpirationDate
accountExpires
AccountLockoutTime
AccountNotDelegated
AllowReversiblePasswordEncryption
BadLogonCount
badPwdCount
c
CannotChangePassword
CanonicalName
....
userAccountControl
userCertificate
UserPrincipalName
uSNChanged
uSNCreated
whenChanged
whenCreated
PropertyNames
PropertyCount

Você não pode realmente ver o que o Cmdlet poderia retornar antes mesmo de executá-lo, por causa de objetos dinâmicos de retorno ... não há como saber exatamente o que ele retornará antes de ser executado. Por exemplo, um objeto retornado por Get-ADUser pode ou não ter a propriedade 'EmployeeID' com base em se ele é preenchido no AD ou não. Não quero dizer que a propriedade terá um valor de $ Null ou [String] :: Empty, quero dizer que a propriedade literalmente não existirá nesse objeto.

Se você usar Set-StrictMode, isso é especialmente evidente, já que ele vai latir para tentar filtrar uma propriedade inexistente de um objeto, mesmo que a propriedade exista em alguns, mas não em outros, objetos do conjunto total devolvido.

Para elaborar meu ponto ... quando estou criando um cmdlet, posso ter lógica em meu cmdlet, onde se uma determinada condição for verdadeira, posso adicionar uma determinada propriedade nova ao objeto a ser retornado ou caso contrário, a propriedade não será devolvida ...

if($x = $true) 
{    
    $object | Add-Member -Type NoteProperty -Name $name -Value $y 
}
Else
{
    # In this case, $object will NOT have the above property!
}
    
por 05.08.2013 / 22:17