Часто, когда я пишу сценарий, я пробую команду, но хочу отфильтровать результаты. Чтобы узнать, что я могу фильтровать, мне нужно знать, какие фильтруемые атрибуты будут доступны.
Например, я хочу получить список установленных функций, но мне нужно фильтровать только по установленным. В 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
... или я упустил суть?