我有一个包含计算机列表的文件,我需要遍历该列表并报告是否有空。

$list = get-content "pathtofile.txt"

foreach ($computer in $list) {
  try {
    quser /server:$computer
  } catch [System.Management.Automation.RemoteException] {
    Write-Host "$computer is free"
  }
}

现在它可以工作了,但是我希望捕获错误消息并将其更改为混乱的计算机名称是免费的。

目前它仍在返回

quser:*没有用户存在
在线:5字符:5
+ quser / server:$计算机
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:未指定:(不存在*:String用户)[],RemoteException
+ FullyQualifiedErrorId:NativeCommandError

对于免费的计算机。

通过在我知道是免费的计算机上运行System.Management.Automation.RemoteException命令,然后运行quser,我能够获得$Error[0] | fl * -Force:

writeErrorStream:True
PSMessageDetails:
异常:System.Management.Automation.RemoteException:没有用于*的用户
TargetObject:*没有用户
CategoryInfo:未指定:(没有用户可用于*:String)[],RemoteException
FullyQualifiedErrorId:NativeCommandError
错误详情 :
InvocationInfo:System.Management.Automation.InvocationInfo
ScriptStackTrace:at,:第1行
PipelineIterationInfo:{0,0}

这给了我异常代码。

现在,我确实查看了Foreach error handling in Powershell,它显示了我的代码应该正确,因此不确定为什么捕获不起作用。

最佳答案

try {
    $savePreference = $ErrorActionPreference
    $ErrorActionPreference = 'Stop'
    quser /server:$computer 2>&1
}

catch [System.Management.Automation.RemoteException] {
    Write-Host "$computer is free"
}

finally
{
    $ErrorActionPreference = $savePreference
}

10-06 12:58