multithreading - 如何使用 -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
解决方案
我没有特定的解决方案,但这是您的问题的原因:
该-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
。(据我所知。)
推荐阅读
- java - 我可以使用 if else 语句编写 Firestore 查询吗?
- powershell - 无法使用 powershell rest API 从 cosmos 获取文档数
- r - 如何在 R 中将数据表示为字符串,就像在 REPL 中一样?
- angular - 缩小屏幕时,卡片不改变行数
- javascript - 不输入指令
- php - 如何在 Laravel 中自定义作业的日志输出?
- angular - 多模块角度应用程序中的 ng-translate 问题
- gcloud - 我无法在 lubuntu 上运行 gcloud 命令
- php - Guzzle 请求:发布正文数据
- alamofire - swift 5中的Alamofire请求