2014-03-26 87 views
2

我注意到PowerShell中的一些奇怪行爲。我已經驗證了我認爲在PowerShell 2和PowerShell 4中的錯誤行爲。它確實是一個錯誤還是隻是我做錯了?這是PowerShell中的錯誤嗎?

請看下面的代碼片段。這個想法是簡單地通過Active Directory組名稱的列表(字符串數組)迭代,並且告訴我有多少個成員各組:

Foreach($ADGroupName In [String[]]'Domain Admins',  ` 
            'Enterprise Admins', ` 
            'Administrators', ` 
            'Account Operators', ` 
            'Backup Operators') 
{ 
    $Group = Get-ADGroup -Filter { Name -EQ $ADGroupName } -Properties Members 
    If ($Group -EQ $Null -OR $Group.PropertyNames -NotContains 'Members') 
    { 
     # This only happens on the first iteration of the loop! 
     Write-Error "$ADGroupName was null or was missing the Members property!" 
    } 
    Else 
    { 
     Write-Host "$ADGroupName contains $($Group.Members.Count) members." 
    } 
} 

通過循環的第一次迭代,我得到的錯誤,因爲$組爲$ null,因此不包含正確的成員,但命令和組名都是有效的,並且該組具有成員。通過循環的後續迭代很好地工作。但是,列表中的第一組是什麼都沒有關係。我可以對組重新排序,但它總是在字符串數組的第一個元素上返回錯誤。

現在要解決它,我只是簡單地將'DummyGroup'作爲數組的第一個元素,並優雅地處理預期的異常,然後列表中的其他每個組都能正常工作。

有沒有更好的方法來處理看起來像是一個bug?

回答

3

不知道你是否真的把它稱爲「bug」,但它是由在腳本塊過濾器中使用變量引起的。如果更改爲使用字符串過濾器可擴展字符串變量擴展按預期工作:

Foreach($ADGroupName In [String[]]'Domain Admins',  ` 
            'Enterprise Admins', ` 
            'Administrators', ` 
            'Account Operators', ` 
            'Backup Operators') 
{ 
    $Group = Get-ADGroup -Filter "Name -EQ '$ADGroupName'" -Properties Members 
    If ($Group -EQ $Null -OR $Group.PropertyNames -NotContains 'Members') 
    { 
     # This only happens on the first iteration of the loop! 
     Write-Error "$ADGroupName was null or was missing the Members property!" 
    } 
    Else 
    { 
     Write-Host "$ADGroupName contains $($Group.Members.Count) members." 
    } 
} 
+0

經驗教訓,謝謝。有時難以記住何時使用腳本塊以及何時使用字符串,特別是對於AD cmdlet。看起來像不同的cmdlet處理它們的方式不同,你只需要記住它們的特性。如果他們不希望我使用scritpblock,那麼他們應該將其標記爲語法錯誤。 > _ < –

1

由於mjolinor固定的錯誤;只是爲了練習PowerShell的樂趣,我重寫了一下,刪除了錯誤檢查。

  • 您可以使用@()來創建組名的數組,而不需要反引線的延續。
  • 您可以致電Get-ADGroup $ADGroupName -Properties Members,無需過濾
  • 或者你也可以通過管道陣列送入GET-廣告組,並獲得多個組回來,在一個操作

例如

$ADGroupNames = @('Domain Admins', 
        'Enterprise Admins', 
        'Administrators', 
        'Account Operators', 
        'Backup Operators') 

$ADGroups = $ADGroupNames | Get-ADGroup -Properties Members 
$ADGroups | ForEach { write "$($_.Name) contains $($_.Members.Count) members" }