Проблемы добавления многопоточности в скрипт - PullRequest
0 голосов
/ 29 января 2019

Я создал скрипт для проверки клиентских шлюзов на наличие открытых портов, который прекрасно работает, но работает вечно.Поэтому я пытаюсь разделить работу на потоки, чтобы она работала быстрее.

Проблема, которая у меня возникает, заключается в том, что когда я делаю Get-Job |Receive-Job утверждает, что -Port имеет значение 0

Добавление / удаление -ArgumentList $ gateway, $ port (или просто port), похоже, не решает проблему.

IПервоначально пытался с помощью 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 голосов
/ 30 января 2019

Как упомянуто ранее в моем комментарии, параметры должны были быть добавлены к работе.Другое дело, что задания не обязательно запускаются в том же каталоге, в котором вызывается скрипт.Таким образом, файл .csv не создается там, где вы можете их ожидать.Поэтому я также добавил параметр для этого.

Это работает (на моей машине):

$gateways = Import-CSV '.\perlaw.csv'
$ports = 22, 80, 8080, 443, 4443, 3389
foreach ($gateway in $gateways) {
    $scriptblock = {
        param (
            $gateway,
            $ports,
            $path
        )
        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) {
                Out-File -FilePath $path\$($gateway.'group id').csv -InputObject $output -NoClobber -Append;
            }
        }

    }
    Start-Job -ScriptBlock $scriptblock -ArgumentList $gateway, $ports, (Get-Location).Path
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...