每个循环内的Powershell启动过程

问题描述

对于每个希望并行运行的循环,我都有一个for,但是关于每次迭代的开始时间,我没有一个统一的时间,这导致了一些边缘情况下的时序问题。

这样,我将循环更改为连续的。但是,我不想等待迭代命令完成。

每次迭代本质上都是在做:

Invoke-pester @{Path= "tests.ps1"; Parameters = @{...}} -Tag 'value' -OutputFile $xmlpath -OutputFormat NUnitXML -EnableExit

我希望每个迭代都按顺序运行(测试应该按顺序运行),但是我不想等待测试完成。

最好的方法是确保迭代不等待Invoke-pester命令完成,以便下一次迭代在上一次迭代启动之后开始?我尝试使用start-process Invoke-pester,但我认为它使进一步的代码结构无效。

谢谢

解决方法

PowerShell jobs是异步处理的一种方法。一个非常基本的例子:

const initialData = {
    country_id: [1,2],user_id: [],title: 'Some Nice Title',code: 'gfrhfhhhfrgde',}

const finalData = Object.entries(initialData).reduce((prev,next) => 
 (next[1]?.length > 0) ? ({ ...prev,[next[0]]: next[1]}) : prev,{})

console.log(finalData)

但是,工作非常缓慢。性能更高但也更复杂的方法是使用background runspaces

$jobs = foreach ($xmlPath in (...)) {
    Start-job { Invoke-Pester -OutputFile $Args[0] ... } -ArgumentList $xmlPath
}

# get the job results later:
$jobs | Receive-Job