14

我有一些看起来像这样的代码:

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

不幸的是,当 Get-ADUser DN 找不到用户时(这很好,这意味着对象名称没有被占用),它抛出并吐出一个错误。我知道它会失败,这很好,这就是为什么我有一个-ErrorActionto SilentlyContinue。不幸的是,它似乎什么也没做......我仍然对脚本输出感到厌烦。该代码有效,只是由于控制台吐出错误而很难看。

  • 有没有更好的方法来测试特定对象是否存在?
  • 如果没有,有没有办法让 ErrorAction 正确地保持沉默?
4

6 回答 6

21

我发现在不吐出错误的情况下工作的唯一方法是使用 filter 参数:

if (Get-ADUser -Filter {distinguishedName -eq $DN} ) {
  # Exists
} else {
  # Doesn't Exist
}
于 2012-07-23T07:04:42.027 回答
13

您想捕获未找到对象的异常,但您仍然希望由于访问被拒绝等其他原因而失败,因此您需要指定要捕获的确切异常。

Try
{
  Get-ADUser $DN -ErrorAction Stop
  # Do stuff if found
}
Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
{ 
  # Do stuff if not found
}

要确定要在其他用例中捕获的异常类型,请引发异常,然后执行以下操作:

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

其输出进入:catch [在此处插入异常类型]

于 2018-01-22T20:12:38.487 回答
10

这是一个例外,您可以尝试像这样捕获它:

$user = $(try {Get-ADUser $DN} catch {$null})
if ($user -ne $null) {
  # Exists
} else {
  # Doesn't Exist
}
于 2012-07-23T03:46:09.147 回答
3

看来此命令正在发出终止错误。使用 atry { ... } catch { ... }来处理/抑制错误。

于 2012-07-23T03:42:46.310 回答
0

我会这样做:

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

Id 或其他一些唯一标识符。

这将返回用户或 null 并将包装异常。

于 2012-07-23T06:55:03.157 回答
0

我喜欢使用 filter 参数,因为如果用户不存在,它会返回 null 而不是抛出异常。

例子:

$user = Get-ADUser -Filter "SamAccountName -eq '$username'"

if ($user -eq $null)
{
    #User does not exist
}
else
{
    #User exists
}
于 2021-06-10T20:09:16.680 回答