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
相关产品推荐
相关产品推荐

