【问题标题】:PS - Capture returned error codes from quser queryPS - 从 quser 查询中捕获返回的错误代码
【发布时间】:2021-11-12 16:51:56
【问题描述】:

使用 PS 5 的 Powershell 脚本:

运行脚本循环遍历 AD 中的所有服务器,如果指定用户在该服务器上有登录会话,则获取 sessionID。我正在使用 quser 这样做:

 $sessionID = ((quser /server:$server | ? { $_ -match $username } ) -split ' +')[2]

有一些服务器正在返回:

Error 0x000006BA enumerating sessionnames
Error [1722]:The RPC server is unavailable.

我不担心这个错误的原因(这是一个帐户权限问题——不是这个问题的主题)

我要做的是在这种情况发生时捕捉;但是,即使使用 -ErrorAction Stop,它也不会被 try/catch 捕获,如果我检查 $? 它会返回 True。我试过测试 $?并将 -ErrorAction Stop 放置在管道的各个点,甚至将其减少为仅 /quser 查询,而无需尝试去除 sessionID:$sessionID = quser /server:$server -ErrorAction Stop

该错误输出也没有存储在 $SessionID 中,因此我无法在那里检查它。

如何捕获此错误输出,以便将其放置在脚本其他位置创建的状态/日志记录输出文件中?

【问题讨论】:

  • 类似:$quser = quser /server:$server 2>&1 | Out-File -FilePath C:\MyPath\here.txt?
  • Quser 不是 powershell 命令,因此无法识别 -ErrorAction。尝试在 try/catch 之前设置 $erroractionpreference = ‘Stop’

标签: powershell error-handling


【解决方案1】:

对于外部命令错误,$LASTEXITCODE 将为非零值。美元?也将是错误的,但是一旦运行另一个 powershell 命令或运算符, $?再次设置。 Try/catch 和 erroraction 对外部命令没有影响。

$quser = quser /server:yahoo.com | ? { $_ -match 'joe' }
Error 0x000006BA enumerating sessionnames
Error [1722]:The RPC server is unavailable.

$?
False

$LASTEXITCODE
1

$?
True

连括号都变了$?。

$quser = (quser /server:yahoo.com | ? { $_ -match 'joe' })
Error 0x000006BA enumerating sessionnames
Error [1722]:The RPC server is unavailable.

$?
True

$LASTEXITCODE
1

这是一种保留 $? 的方法。

$quser = quser /server:yahoo.com | ? { $_ -match 'joe' } | % { (-split $_)[2] }
Error 0x000006BA enumerating sessionnames
Error [1722]:The RPC server is unavailable.

$?
False

$LASTEXITCODE
1

【讨论】:

  • 很确定这是因为$LASTEXITCODE 运行成功。 $? 用于内部 powershell 使用,它将捕获上一个命令是否成功运行。
  • @AbrahamZinala 这是一个很好的观点。甚至运行$?两次就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2013-03-15
相关资源
最近更新 更多