如何忽略 Powershell 中的错误并让其继续?

如何忽略 Powershell 中的错误并让其继续?

我正在尝试查看一个进程是否在多台服务器上运行,然后将其格式化为一个表。

get-process -ComputerName server1,server2,server3 -name explorer | Select-Object processname,machinename

这是最简单的部分 - 当进程不存在或服务器不可用时,powershell 会输出一个非常丑陋的错误,弄乱表格并且无法继续。示例

Get-Process : Couldn't connect to remote machine.At line:1 char:12 + get-process <<<<  -ComputerName server1,server2,server3 -name explorer | format-table processname,machinename
+ CategoryInfo          : NotSpecified: (:) [Get-Process], InvalidOperatio   nException    + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.Power   Shell.Commands.GetProcessCommand

我该如何解决这个问题?如果我仍然希望在进程不可用或正在运行时收到通知。

答案1

添加-ErrorAction SilentlyContinue到您的命令。

当它不是错误,而是未处理的异常时,您应该添加-EV Err -EA SilentlyContinue,以捕获异常。(EA是的别名ErrorAction

然后,您可以通过查看以下内容来评估脚本中的错误$Err[0]

答案2

简短回答: 在代码开头添加$ErrorActionPreference = 'SilentlyContinue',这样就不需要-ErrorAction SilentlyContinue在每个命令中添加

长答案: 控制错误报告行为和拦截错误

答案3

尝试将服务器名称逐个传输到命令中。这样您就可以一次处理一台机器的错误。

'server1', 'server2', 'server3' |
  foreach {
    try {
      Get-Process -ComputerName $_ -Name Explorer -ErrorAction SilentlyContinue
    } catch {} #Yes. I actually don't care about any errors.
  } |
    select ProcessName, MachineName

当然,这不会捕获任何因网络问题或访问权限而产生的错误。因此,我们无法确定您确实已将列表中的所有计算机都运行了 Explorer。

注意:PowerShell Core 中不再提供Get-Processwith 参数。否则需要改用。-ComputerNameInvoke-Command

相关内容