通常当我编写脚本时,我会尝试一个命令,但是会过滤结果。 为了找出我能够过滤什么,我需要知道什么可过滤的属性将可用。
例如,我想要获取已安装function的列表,但需要按安装进行过滤。 Get-InstalledFeature CMDlet没有-InstalledOnlytypes的标志,所以我需要过滤结果。 要找出我能过滤的东西,我会做类似的事情
(Get-InstalledFeature)[0] | fl
要么
Get-InstalledFeature | Select -First 1 | fl
并会发现,我可以(直观地说,我应该说)过滤上Installed 。 结果命令是
Get-InstalledFeature | ? { $_.Installed }
有没有更容易的方法来找出可过滤的属性? 或者也许我可以以不同的方式工作? 或者,也许我应该闭嘴,并开心已经很容易了!
在这种情况下, Get-Help并没有真正的帮助,因为它不会告诉我我要回来什么。
当然,这是什么Get-Member?
<object> | Get-Member -MemberType Property
…或者我错过了这个观点?
Some-CmdLet | Select * | Select -First 1
将为您提供Cmdlet返回的第一个对象的所有属性,但不一定是Cmdlet返回的对象能够包含的所有属性。
许多(如果不是大多数)Cmdlet返回dynamic对象,如果该属性没有填充在从中检索数据的任何提供程序中,则属性根本不存在(与存在的属性相反,但是具有空值或空值)。
编辑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可能会返回什么,因为dynamic返回对象……不知道在运行之前会返回什么。 例如,由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! }