Windows

確定返回的 Powershell 對象的可過濾屬性

  • August 6, 2013

通常,當我編寫腳本時,我會嘗試一個命令,但會想要過濾結果。為了找出我能夠過濾的內容,我需要知道哪些可過濾屬性將可用。

例如,我想獲取已安裝功能的列表,但只需要按已安裝進行過濾。CMDletGet-InstalledFeature沒有-InstalledOnly類型標誌,所以我需要過濾結果。要找出我可以過濾的內容,我會做類似的事情

(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 返回動態對象,如果該屬性未填充到從中檢索數據的任何提供程序中,則該屬性將根本不存在(與存在但具有 null 或空白值的屬性相反)。

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 $$::空,我的意思是該對像上實際上不存在該屬性。 如果您使用 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!
}

引用自:https://serverfault.com/questions/528842