Powershell 我可以传递一个函数并在PSJobs脚本块中调用它,然后接收返回值吗?
当我运行get job | receive job-keep时,我没有得到任何结果,也无法验证我的函数是否已通过并正常工作。我可以将这样的函数传递到psjob中吗?之后如何捕获返回值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
$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