您如何在foreach语句下将值传递给另一个脚本?

时间:2018-08-10 03:24:17

标签: powershell jobs

我想为每个通过范围选择的端口多次运行1个脚本,并传递需要用于连接的端口详细信息,我试图使用以下脚本:

$availableports = 7000..7050
while ($availableports -notcontains $SPort) {
    [string]$SPort= Read-Host -Prompt 'S Ports'
}
while ($availableports -notcontains $FPort) {
    [string]$FPort= Read-Host -Prompt 'F Ports'
}

$massport = ($SPort)..($FPort)

foreach ($Port in $massport) {
    C:\PShell-Projects\Firmware\SCP-FMUPv2.ps1 -Port "$Port"
}

这有效,但是在引用的脚本完成之前不会继续到下一个端口。

我想同时运行它们。

我尝试了

$arg = @("-Port", $portm)
Start-Job -FilePath C:\PShell-Projects\Firmware\SCP-FMUPv2.ps1 -ArgumentList $arg

但是该作业被阻塞,当我使用Receive-Job时,它要求端口打开一个连接,该连接应该作为循环的一部分发送。

我似乎缺少一些关键信息,但是不知道从哪里开始以及在查找这些信息时似乎并没有脱颖而出。

2 个答案:

答案 0 :(得分:1)

这对我有用:

$jobs = @()
foreach ($Port in $massport) {
    $jobs += start-job -FilePath "job.ps1" -ArgumentList @($port)
}

Receive-Job $jobs -Wait

(ArgumentList中没有命名的参数)。

您还可以查看Invoke-Parallel函数,该函数简化了并行任务的运行。

答案 1 :(得分:0)

您可能可以在C:\PShell-Projects\Firmware\SCP-FMUPv2.ps1 -Port "$Port命令之后使用-asjob使其同时执行。

如果ps1不能使用-asjob,则可以用invoke-command {}包裹它