Определить фильтруемые атрибуты возвращаемого объекта Powershell
Часто, когда я пишу сценарий, я пробую команду, но хочу фильтровать результаты. Чтобы выяснить, что я могу отфильтровать, мне нужно знать, какие фильтруемые атрибуты будут доступны.
Например, я хочу получить список установленных функций, но нужно фильтровать только по установленным. Get-InstalledFeature
CMDlet не имеет -InstalledOnly
введите флаг, поэтому мне нужно отфильтровать результаты. Чтобы выяснить, что я могу отфильтровать, я сделаю что-то вроде
(Get-InstalledFeature)[0] | fl
или же
Get-InstalledFeature | Select -First 1 | fl
и я обнаружу, что могу (интуитивно, я бы сказал) отфильтровать Installed
, Результирующая команда
Get-InstalledFeature | ? { $_.Installed }
Есть ли более простой способ выяснить фильтруемые свойства? Или, может быть, я мог бы работать по-другому? Или, может быть, я должен просто заткнуться и быть счастливым, что это уже так просто!
Get-Help
не очень помогает в этом случае, так как не говорит мне, что я собираюсь вернуть.
2 ответа
Конечно, это то, для чего нужен Get-Member???
<object> | Get-Member -MemberType Property
... или я упускаю суть?
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
Вы не можете реально увидеть, что командлет может вернуть до того, как вы его запустите, из-за динамических возвращаемых объектов... нет точного знания того, что он вернет до того, как запустится. Например, объект, возвращаемый Get-ADUser, может иметь или не иметь свойство EmployeeID в зависимости от того, заполнено ли оно в AD или нет. Я не имею в виду, что свойство будет иметь значение $Null или [String]::Empty, я имею в виду, что это свойство буквально не существует для этого объекта.
Если вы используете Set-StrictMode, это особенно очевидно, поскольку оно будет лаять на вас за попытку фильтрации несуществующего свойства объекта, даже если свойство существует для некоторых, но не для других объектов в общем возвращаемом наборе.,
Чтобы уточнить мою точку зрения... когда я пишу Cmdlet, у меня может быть логика в моем Cmdlet, где, если определенное условие истинно, я могу добавить определенное новое свойство к возвращаемому объекту или иным образом свойство не возвращается...
if($x = $true)
{
$object | Add-Member -Type NoteProperty -Name $name -Value $y
}
Else
{
# In this case, $object will NOT have the above property!
}