首页 > 解决方案 > 如何使用 -AsJob 开关在测试连接中接收错误

问题描述

我正在设置一个监控脚本,它会在数据包失败时 ping IP 并发送电子邮件。我决定使用Test-Connection. 下面是一个示例代码:

代码1

$IPList = @("192.168.0.1","172.217.161.15")
Test-Connection -ComputerName $IPList -BufferSize 4 -Count 1 -AsJob -ErrorAction Stop
Get-Job | Wait-Job | Receive-Job

所以我得到的结果是:

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
BLR-AA200906  172.217.161.15                                                            4        55       
BLR-AA200906  192.168.0.1                                                               4                 

192系列IP应该会报错。您可以看到该Time(ms)列是空的。

代码2

$IPList = @("192.168.0.1","172.217.161.15")
foreach ($IP in $IPList)
{
    Start-job -ScriptBlock {Test-Connection -ComputerName $Args[0] -BufferSize 4 -Count 1 -ErrorAction Stop} -ArgumentList $IP
}
Get-Job | Wait-Job | Receive-Job

如果我这样做,它会抛出一个我可以轻松捕获的错误

Testing connection to computer '192.168.0.1' failed: Error due to lack of resources
    + CategoryInfo          : ResourceUnavailable: (192.168.0.1:String) [Test-Connection], PingException
    + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand
    + PSComputerName        : localhost

问题

这让我想到了我的问题。如何接收/捕获 Code1 中抛出的错误消息?不同之处在于我使用-AsJob的是比在foreach循环中旋转作业更有效的方法。

PS版本是5.1

标签: multithreadingpowershellstart-job

解决方案


我没有特定的解决方案,但这是您的问题的原因:

-AsJob参数创建一个 WMI 作业,而Start-Job创建一个 CIM 作业。

每个 WMI 作业都有自己的实例,而 CIM 作业在您当前的 Powershell 实例中运行。因此,WMI 作业不需要额外的时间来使用当前会话创建和销毁实例,这可能会非常昂贵。

WMI 作业通常与 Powershell 更加分离。他们似乎没有要转录的“主机”外壳。这就是 Powershell 的二元性可能会让人感到困惑的地方。

不幸的是,在这种情况下,这意味着您完全依赖于Test-Connection实现 Powershell 的事件处理程序的 cmdlet,而且情况似乎并非如此,因为作业状态始终记录为“已完成”。您不再能够通过简单地将它们自己的 shell 转储到输出流来回退到 CIM 作业带来的“兼容性”。

Start-Job -ScriptBlock {Write-Host "This is not real output."} | Wait-Job | Receive-Job
PS> This is not real output.

因此,在你的情况下,如果你必须使用-AsJob,你能做的最好的就是 monitor $error。(据我所知。)


推荐阅读