从Start-Job调用获取输出

时间:2018-09-06 23:58:29

标签: windows multithreading powershell start-job

我有以下代码可以工作,因为它创建了多个作业,并在阵列(Parent's)上的所有计算机上运行脚本块中的内容。问题是它没有提供任何有意义的输出,我可以用它来确定代码是否成功运行。我已经尝试了大约100种Google搜索过的东西,但似乎没有一种解决方案适合我。这是我正在尝试运行的代码,我认为它应该可以根据我在StackOverflow上看到的其他帖子进行工作。

$SMSMembers

除了将文件复制到远程计算机然后将其删除之外,该脚本没有其他用途。如果工作成功与否,我只想获取输出。就像我说的那样,这段代码按应有的方式工作,只是我没有得到反馈。

我的最终目标是能够向计算机阵列($SMSMembers = @("computer1","computer2","computer3") $output = @() foreach ($compName in $SMSMembers) { $scriptblock = { $file = {"test"} $filepath = "\\$using:compName\c$\scripts\NEWFILE.txt" $file | Out-File -FilePath $filepath Start-Sleep -Seconds 5 Remove-Item $filepath } $output += Start-Job -ScriptBlock $scriptblock | Get-Job | Receive-Job } Get-Job | Wait-Job foreach ($item in $output) { Write-Host $item } )发送命令,并使用此代码请求当前用户并获取用户名输入:

$SMSMembers

2 个答案:

答案 0 :(得分:2)

您可以创建作业,获取作业信息,然后在作业可以完成之前背对背接收作业。相反,请收集作业信息,然后在循环外部等待作业完成,并在作业完成后接收输出。

$SMSMembers = @("computer1","computer2","computer3")
$scriptblock = {
    $file = {"test"}
    $filepath = "\\$using:compName\c$\scripts\NEWFILE.txt"
    $file | out-file -FilePath $filepath
    Start-Sleep -Seconds 5
    remove-item $filepath
}
$Jobs = foreach($compName in $SMSMembers){
    Start-Job -ScriptBlock $scriptblock
}
Wait-Job $Jobs
$Output = Receive-Job $Jobs
foreach ($item in $output){
    write-host $item
}

编辑:略微修改了脚本,所以我不是随机复制文件,但它的功能仍然相同。然后以预期的结果对其进行测试:

$SMSMembers = @("computer1","computer2","computer3")
$scriptblock = {
    $RndDly=Get-Random -Minimum 10 -Maximum 45
    start-sleep -Seconds $RndDly
    "Slept $RndDly, then completed for $using:compname"
    }
$Jobs = foreach($compName in $SMSMembers){
    Start-Job -ScriptBlock $scriptblock
}
Wait-Job $Jobs
$Output = Receive-Job $Jobs
foreach ($item in $output){
    write-host $item
}

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      Job1            BackgroundJob   Completed     True            localhost            ...                      
3      Job3            BackgroundJob   Completed     True            localhost            ...                      
5      Job5            BackgroundJob   Completed     True            localhost            ...                      
Slept 30, then completed for computer1
Slept 27, then completed for computer2
Slept 11, then completed for computer3

答案 1 :(得分:0)

看看下面的代码,我想你应该可以弄清楚这一点。

>  Get-job | Receive-Job 2>&1 >> c:\output.log

2>&1 >>收集了Get-Job | Receive-Job的所有输出,它对于start-job的工作也应类似