9

我有一些代碼,看起來像這樣:檢查是否存在AD對象;我該如何避免一個醜陋的錯誤信息?

if (Get-ADUser $DN -EA SilentlyContinue) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 

不幸的是,當GET-ADUser便有了DN無法找到用戶(這是很好的,這意味着對象名稱不採取),它拋出並吐出一個錯誤。我知道它會失敗,這很好,這就是爲什麼我有一個-ErrorActionSilentlyContinue。不幸的是,它似乎什麼都不做......我仍然在腳本輸出上得到了一些東西。代碼起作用,由於控制檯吐出了錯誤,這只是醜陋而已。

  • 有沒有更好的方法來測試一個特定的對象是否存在?
  • 如果沒有,有沒有辦法讓ErrorAction正確地保持沉默?
+1

注意:使用try ... catch解決方案,您可以更具體;即通過捕獲命名的例外。 'try {Get-ADUser $ DN -EA Stop} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {「nice try」} catch {「not expected issue」} – JohnLBevan 2014-10-12 23:30:55

+1

'get-aduser -erroraction'silentlycontinue''似乎在PowerShell-v4.0中正常工作。 – 2015-12-30 17:48:44

回答

1

你想捕捉對象外不被人發現,但你還是要失敗其他原因,如訪問被拒絕等,所以你需要指定確切的異常來捕捉。

try { 
    Get-ADUser $DN -ErrorAction Stop 
    # Do stuff if found 
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundExce‌​ption] { 
    # Do stuff if not found 
} 

爲了確定異常的類型在其他使用情況趕上,導致異常,然後執行:

$Error[0].Exception.GetType().FullName 

,它的輸出進入:抓[插入異常類型在這裏]

2

看來這個命令發出了終止錯誤。使用try { ... } catch { ... }來處理/抑制錯誤。

8

這是一個例外,你可以嘗試趕上這樣的:

$user = $(try {Get-ADUser $DN} catch {$null}) 
if ($user -ne $null) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 
+1

這個效果很好。 – HostBits 2012-11-02 19:10:17

0

我會做這樣的:

Get-ADUser | ?{$_.id -eq $DN.id} 

Id或一些其他唯一標識符。

這將返回用戶或null,並將包裝該異常。

+2

雖然有效,但如果您的尺寸適中,則速度會非常慢。獲取每個對象,然後過濾是不實際的。 – 2012-07-23 09:27:33

+0

是的,這是針對較小的一組迭代。實際上它與Shay Levy的單行相同。 – 2012-07-23 09:29:21

+0

你確定嗎?我的印象是--Filter作爲LDAP查詢直接傳入,以防止服務器返回數千個結果。 – 2012-07-23 15:53:14

16

我發現是工作不隨地吐痰錯誤的唯一方法是與濾波器參數:

if (Get-ADUser -Filter {distinguishedName -eq $DN}) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 
+0

如何獲得'-Properties *'並仍然消除這些錯誤? – 2017-04-11 17:19:22

相關問題