我正在尝试查看一个进程是否在多台服务器上运行,然后将其格式化为一个表。
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-Process
with 参数。否则需要改用。-ComputerName
Invoke-Command