在脚本中添加多线程的问题

时间:2019-01-29 17:09:55

标签: powershell

我已经编写了一个脚本来检查客户端网关的开放端口,该脚本虽然效果很好,但要花很长时间才能运行。因此,我试图将工作分成多个线程,以使工作更快。

我似乎遇到的问题是,当我进行Get-Job | Receive-Job声称-Port的值为0

添加/删除-ArgumentList $ gateway,$ port(或仅端口)似乎无法解决问题。

我最初尝试使用Invoke-Comment来限制工作数量,但是我已经恢复到仅尝试使其工作。

$gateways = Import-CSV '.\perlaw.csv'
$ports = 22, 80, 8080, 443, 4443, 3389
foreach ($gateway in $gateways){
$scriptblock = {foreach ($port in $ports){
    $result = Test-NetConnection $gateway.'connection gateway' -Port $port;

    $out =  @(
        $gateway.'group id',
        $gateway.'connection gateway',
        $port
    )
    $output = "{0}, {1}, {2}" -f $out
    if ($result.TcpTestSucceeded -eq 'True'){
        Out-File -FilePath .\$($gateway.'group id').csv -InputObject 
$output -NoClobber -Append;
    }
}

}
    Start-Job -ScriptBlock $scriptblock -ArgumentList $gateways, $ports
}

我希望这能遍历网关列表,该网关的每个端口,测试组合并将结果输出到文件中。

当单线程,添加多线程时,这些工作立即完成,并且没有任何内容写入文件。如果我更改作业以使每个运行Get / Receive-Job的端口运行一个作业,则无论我通过什么管道将端口显示为0。

希望这很有道理!

1 个答案:

答案 0 :(得分:0)

就像我之前在评论中提到的那样,必须将参数添加到作业中。另一件事是,作业不必在与调用脚本相同的目录中启动。因此,不会在可能需要它们的位置创建.csv文件。所以我也为此添加了一个参数。

(在我的机器上)这有效:

return