web-dev-qa-db-ja.com

ADオブジェクトの存在を確認します。どうすれば醜いエラーメッセージを回避できますか?

私は次のようなコードを少し持っています:

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

残念ながら、Get-ADUser DNがユーザーを見つけられない場合(これは問題ありません。つまり、オブジェクト名が取得されないことを意味します)、例外がスローされ、エラーが出力されます。私はそれが失敗することを知っています、それは大丈夫です、それが私が-ErrorActionからSilentlyContinueを持っている理由です。残念ながらそれは何もしないようです...私はまだスクリプト出力でbarfを取得します。コードは機能しますが、コンソールがエラーを吐き出すため、醜いです。

  • 特定のオブジェクトが存在するかどうかをテストするためのより良い方法はありますか?
  • そうでない場合、ErrorActionを適切に無音にする方法はありますか?
12
Myrddin Emrys

見つからないオブジェクトの例外をキャッチしたいが、アクセスが拒否されたなどの他の理由で失敗したいので、キャッチする正確な例外を指定する必要があります。

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

その出力は次のようになります:catch [ここに例外タイプを挿入]

5
Andy Fraley

エラーを吐き出すことなく機能していることがわかった唯一の方法は、filterパラメーターを使用することです。

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

それは例外です、あなたはちょうどこのようにそれをキャッチしようとすることができます:

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

このコマンドは終了エラーを出しているようです。使う try { ... } catch { ... }エラーを処理/抑制します。

3
Keith Hill

私はこれを次のように行います:

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

IDまたはその他の一意の識別子。

これはユーザーまたはnullを返し、例外をラップします。

0