You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Powershell/CMD中是否有Bash的&与wait嵌套并行同步的等价实现?

嵌套并行任务的PowerShell简洁实现

核心逻辑:每个模块内先并行执行3个任务,等待全部完成后执行模块收尾任务;两个模块并行执行,最后执行全局收尾任务。

通用版(兼容PowerShell 5及以上)

# 封装模块内的并行+串行逻辑
$moduleLogic = {
    # 并行启动3个sleep+echo任务
    $subJobs = 1..3 | ForEach-Object {
        Start-Job -ScriptBlock {
            Start-Sleep -Seconds 1
            Write-Host "模块内任务 $_ 完成"
        } -ArgumentList $_
    }
    # 等待3个子任务全部结束
    Wait-Job -Job $subJobs | Out-Null
    Remove-Job -Job $subJobs | Out-Null
    # 执行模块收尾任务
    Start-Sleep -Seconds 1
    Write-Host "模块内收尾任务完成"
}

# 并行启动两个模块
$moduleJobs = @(
    Start-Job -ScriptBlock $moduleLogic
    Start-Job -ScriptBlock $moduleLogic
)

# 等待两个模块全部结束
Wait-Job -Job $moduleJobs | Out-Null
Remove-Job -Job $moduleJobs | Out-Null

# 执行全局收尾任务
Start-Sleep -Seconds 1
Write-Host "全局收尾任务完成"

简化版(PowerShell 7+专属)

利用ForEach-Object -Parallel进一步精简代码:

# 定义模块内逻辑
$moduleAction = {
    # 并行执行3个子任务
    1..3 | ForEach-Object -Parallel {
        Start-Sleep 1
        Write-Host "模块内任务 $_ 完成"
    }
    # 模块收尾
    Start-Sleep 1
    Write-Host "模块内收尾任务完成"
}

# 并行启动两个模块
1..2 | ForEach-Object -Parallel $using:moduleAction

# 全局收尾
Start-Sleep 1
Write-Host "全局收尾任务完成"

嵌套并行任务的CMD(批处理)简洁实现

CMD无原生作业管理,用后台进程+临时文件标记实现同步:

@echo off
setlocal enabledelayedexpansion

:: 模块执行函数
:ModuleTask
    :: 清理旧标记文件
    del /f /q task1.tmp task2.tmp task3.tmp >nul 2>&1
    :: 并行启动3个sleep+echo任务(用timeout模拟sleep)
    start /b "" cmd /c "timeout /t 1 /nobreak >nul & echo 模块内任务1完成 & echo. > task1.tmp"
    start /b "" cmd /c "timeout /t 1 /nobreak >nul & echo 模块内任务2完成 & echo. > task2.tmp"
    start /b "" cmd /c "timeout /t 1 /nobreak >nul & echo 模块内任务3完成 & echo. > task3.tmp"
    
    :: 轮询等待3个子任务完成
    :WaitSubTasks
        if not exist task1.tmp goto WaitSubTasks
        if not exist task2.tmp goto WaitSubTasks
        if not exist task3.tmp goto WaitSubTasks
    del /f /q task1.tmp task2.tmp task3.tmp >nul 2>&1
    
    :: 模块收尾任务
    timeout /t 1 /nobreak >nul
    echo 模块内收尾任务完成
    echo. > module%1.tmp
goto :eof

:: 并行启动两个模块
start /b "" cmd /c call :ModuleTask 1
start /b "" cmd /c call :ModuleTask 2

:: 等待两个模块完成
:WaitModules
    if not exist module1.tmp goto WaitModules
    if not exist module2.tmp goto WaitModules
del /f /q module1.tmp module2.tmp >nul 2>&1

:: 全局收尾任务
timeout /t 1 /nobreak >nul
echo 全局收尾任务完成

endlocal

注:若系统不支持timeout,可用ping -n 2 127.0.0.1 >nul替代实现1秒延迟

内容的提问来源于stack exchange,提问作者adMC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:20:25