Назад | Перейти на главную страницу

Определение фильтруемых атрибутов возвращаемого объекта Powershell

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

Например, я хочу получить список установленных функций, но мне нужно фильтровать только по установленным. В Get-InstalledFeature CMDlet не имеет -InstalledOnly флаг типа, поэтому мне нужно отфильтровать результаты. Чтобы узнать, что можно отфильтровать, я сделаю что-нибудь вроде

(Get-InstalledFeature)[0] | fl

или

Get-InstalledFeature | Select -First 1 | fl

и обнаружу, что могу (интуитивно, я бы сказал) фильтровать Installed. В результате команда

Get-InstalledFeature | ?  { $_.Installed }

Есть ли более простой способ узнать фильтруемые свойства? Или, может быть, я мог бы работать по-другому? А может мне стоит просто заткнуться и радоваться тому, что это уже так просто!

Get-Help в этом случае не особо помогает, так как не говорит мне, что я верну.

Some-CmdLet | Select * | Select -First 1

Дает вам все свойства первого объекта, возвращаемого командлетом, но не обязательно все свойства, которые могут содержать объекты, возвращаемые командлетом.

Многие, если не большинство командлетов, возвращают динамические объекты, в которых свойство просто не существует (в отличие от свойства, существующего, но с нулевым или пустым значением), если это свойство не заполнено каким-либо поставщиком, от которого получены данные.

Edit2: Также вы можете попробовать что-то вроде этого:

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

Вы действительно не можете увидеть, что Cmdlet может вернуть, прежде чем вы даже запустите его, из-за динамических объектов возврата ... неизвестно точно, что он вернет до его запуска. Например, объект, возвращаемый Get-ADUser, может иметь или не иметь свойство «EmployeeID» в зависимости от того, заполнен он в AD или нет. Я не имею в виду, что свойство будет иметь значение $ Null или [String] :: Empty, я имею в виду, что это свойство буквально не будет существовать для этого объекта.

Если вы используете Set-StrictMode, это особенно очевидно, так как он будет лаять на вас за попытку отфильтровать несуществующее свойство объекта, даже если свойство существует на некоторых, но не на других объектах в общем возвращаемом наборе. .

Чтобы уточнить свою точку зрения ... когда я создаю командлет, у меня может быть логика в моем командлете, где, если определенное условие истинно, я могу добавить определенное новое свойство к возвращаемому объекту, или иначе свойство не возвращается ...

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

Неужто для этого и нужен Get-Member ???

<object> | Get-Member -MemberType Property

... или я упустил суть?