编写脚本时,我经常会尝试执行某个命令,但希望过滤结果。为了找出可以过滤的内容,我需要知道有哪些可过滤属性可用。
例如,我想获取已安装功能的列表,但需要仅按已安装进行筛选。CMDletGet-InstalledFeature
没有-InstalledOnly
类型标志,因此我需要筛选结果。要找出我可以筛选的内容,我将执行以下操作
(Get-InstalledFeature)[0] | fl
或者
Get-InstalledFeature | Select -First 1 | fl
并会发现我可以(直觉上应该说)过滤Installed
。结果命令是
Get-InstalledFeature | ? { $_.Installed }
有没有更简单的方法来找出可过滤属性?或者我可以用不同的方法?或者我应该闭嘴,并为它已经如此简单而感到高兴!
Get-Help
在这种情况下并没有什么帮助,因为它没有告诉我我会得到什么回报。
答案1
当然,这就是 Get-Member 的用途吗?
<object> | Get-Member -MemberType Property
……还是我没抓住重点?
答案2
Some-CmdLet | Select * | Select -First 1
将为您提供 Cmdlet 返回的第一个对象的所有属性,但不一定是 Cmdlet 返回的对象能够包含的所有属性。
许多(如果不是大多数) Cmdlet 都会返回动态对象,如果某个属性未在检索数据的提供程序中填充,则该属性根本不存在(与属性存在但具有空值或空白值相反)。
编辑2:此外,您可以尝试这样的操作:
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,这一点尤其明显,因为它会因为尝试过滤对象不存在的属性而向您发出警告,即使该属性存在于整个返回集合中的某些对象上而其他对象上不存在。
详细说明我的观点……当我编写 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!
}