Powershell 我可以传递一个函数并在PSJobs脚本块中调用它,然后接收返回值吗?

Powershell 我可以传递一个函数并在PSJobs脚本块中调用它,然后接收返回值吗?,powershell,scripting,jobs,Powershell,Scripting,Jobs,当我运行get job | receive job-keep时,我没有得到任何结果,也无法验证我的函数是否已通过并正常工作。我可以将这样的函数传递到psjob中吗?之后如何捕获返回值 $servers = @("xxxx", "xxxx") $jobs = New-Object System.Collections.ArrayList; foreach ($server in $servers) { $jobName = $server + &qu

当我运行get job | receive job-keep时,我没有得到任何结果,也无法验证我的函数是否已通过并正常工作。我可以将这样的函数传递到psjob中吗?之后如何捕获返回值

$servers = @("xxxx", "xxxx")
$jobs = New-Object System.Collections.ArrayList;
foreach ($server in $servers)
{
    $jobName = $server + "_job";
    $scriptBlock = 
    {
    
        param($server)
        param($portNumber)
        
        Function testPort ($server, $portNumber)
        {
            $testPort = New-Object System.Net.Sockets.TCPClient # -ArgumentList $server, 3389;
            $testPort.SendTimeout = 3;
            try
            {
                $testPort.Connect($server, 3389);
            }
            catch
            {
                #do nothing;
            }
            $result = $testPort.Connected;
            $testPort.Close();
                    
            return $result;
        }
    
        testPort -server $server -portNumber 3389; sleep 10;    
    }
    $portNumber = "3389";
    
    #Start-Job -Name $jobName -ScriptBlock {$scriptBlock} -ArgumentList $server, $portNumber;

    $jobs.Add((Start-Job -Name $jobName -ScriptBlock {$scriptBlock} -ArgumentList $server, $portNumber | Out-Null));

}

$jobsReturnValues = New-Object System.Collections.ArrayList;
foreach ($job in $jobs)
{
    $jobsReturnValues.Add(($job | Wait-Job | Receive-Job | Out-Null));
}
如果转到,您将看到有一系列cmdlet可用于作业

$job = Start-Job...

$data = $job | Wait-Job | Receive-Job
等待作业
等待作业,直到作业不处于运行状态

接收作业
返回作业的输出

更新

更新代码后,我可以说:

Start-Job -Name $jobName -ScriptBlock {$scriptBlock} -ArgumentList $server, $portNumber | Out-Null
为什么要将它导入
输出Null
?这会使
开始作业的输出消失,并且只将空值追加到
$Job
中。将管道移入
输出Null
Start Job
返回一个
System.Management.Automation.PSRemotingJob
对象,您需要该对象以便以后可以引用它

此外,您在这里执行相同的操作:
$job | Wait job | Receive job | Out Null
。这会使作业的输出消失

Start-Job -Name $jobName -ScriptBlock {$scriptBlock}
需要

Start-Job -Name $jobName -ScriptBlock $scriptBlock
基本上,使用第一种方法将脚本块放在脚本块中


我认为您应该首先使用一些基本示例进行测试,直到了解作业的工作原理。

代码几乎很好,您没有太多错误。主要问题是在函数中使用了
Out Null
、在
-ScriptBlock{$ScriptBlock}
上的
{}
param()
块定义了2次。我也对你的函数做了一些修改:)

看起来像这样:

PS C:\> $jobsReturnValues|select * -ExcludeProperty RunspaceID|ft

ServerName  Port TestConnection
----------  ---- --------------
google.com    80           True
twitter.com   80           True

我尝试了等待作业和接收作业,但并没有得到任何返回值$作业总是空的,我想知道这是否是因为我试图将函数传递到我的$scriptBlock中?我将编辑以显示我的意思。@Bbb查看更新
PS C:\> $jobsReturnValues|select * -ExcludeProperty RunspaceID|ft

ServerName  Port TestConnection
----------  ---- --------------
google.com    80           True
twitter.com   80           True