【问题标题】:Powershell or cmd equivalent to Bash's "& and wait"Powershell 或 cmd 等同于 Bash 的“& 和等待”
【发布时间】:2022-12-09 21:10:23
【问题描述】:

在 powershell 或 cmd (bat) 中是否有一个简单的等价于以下 bash 序列?

它是两个并行运行的 3 个命令块,每个块中有最后的第 4 个命令,两个块都并行执行,然后在两个块完成后执行最后一个命令。

(
(sleep 4; echo waited 4 ) &
(sleep 2; echo waited 2 ) &
(sleep 6; echo waited 6 ) &
wait
(sleep 1; echo waited plus 1 )
) &
(
(sleep 3; echo waited 3 ) &
(sleep 5; echo waited 5 ) &
(sleep 8; echo waited 8 ) &
wait
(sleep 2; echo waited plus 2 )
) &

wait
(sleep 1; echo waited 1 more finally)

产生:

waited 2
waited 3
waited 4
waited 5
waited 6
waited plus 1
waited 8
waited plus 2
waited 1 more finally

我发现这个 https://stackoverflow.com/questions/71366320/in-powershell-how-to-wait-for-parallel-jobs-to-finish-before-proceeding 是最接近同步的,但考虑到所需的叠层并不简单。

【问题讨论】:

    标签: bash powershell


    【解决方案1】:

    这是我自己的答案,因为它可能会帮助其他人。我使用文件而不是控制台来生成执行跟踪。

    “&”部分是通过使用 Start-Job { } 完成的 “等待”部分是通过使用多个 Wait-Job ...

    rm res.txt
    
    $job4 = Start-Job {
    $job1 = Start-Job {  sleep 4; Write-output "waited 4" >> res.txt }
    $job2 = Start-Job {  sleep 2; write-output "waited 2" >> res.txt }
    $job3 = Start-Job {  sleep 6; write-output "waited 6" >> res.txt }
    Wait-Job $job1
    Wait-Job $job2
    Wait-Job $job3
    sleep 1 ; Write-output "waited plus 1"  >> res.txt
    }
    
    $job8 = Start-Job {
    $job5 = Start-Job {  sleep 3; Write-output "waited 3" >> res.txt }
    $job6 = Start-Job {  sleep 5; write-output "waited 5" >> res.txt }
    $job7 = Start-Job {  sleep 8; write-output "waited 8" >> res.txt }
    Wait-Job $job5
    Wait-Job $job6
    Wait-Job $job7
    sleep 2 ; Write-output "waited plus 2" >> res.txt
    }
    
    Wait-Job $job4
    Wait-Job $job8
    
    sleep 1; Write-output "waited 1 more finally" >> res.txt
    

    在 res.txt 文件上使用 tail -f,我可以验证全局序列和时间是否得到遵守。

    <编辑> 最后我使用了一个python版本:

        import subprocess 
        import threading
        
        def bloc1():
                p1 = subprocess.Popen('bash waitecho.bash 4'.split())
                p2 = subprocess.Popen('bash waitecho.bash 2'.split())
                p3 = subprocess.Popen('bash waitecho.bash 6'.split())
        
                p1.wait()
                p2.wait()
                p3.wait()
        
                p4 = subprocess.Popen('bash waitecho.bash 1'.split())
                p4.wait()
        
        def bloc2():
                p5 = subprocess.Popen('bash waitecho.bash 3'.split())
                p6 = subprocess.Popen('bash waitecho.bash 5'.split())
                p7 = subprocess.Popen('bash waitecho.bash 8'.split())
        
                p5.wait()
                p6.wait()
                p7.wait()
        
                p8 = subprocess.Popen('bash waitecho.bash 2'.split())
                p8.wait()
        
        t1 = threading.Thread(target=bloc1)
        t2 = threading.Thread(target=bloc2)
        
        t1.start()
        t2.start()
        
        t1.join()
        t2.join()
        
        p9 = subprocess.Popen('bash waitecho.bash 1'.split())
        p9.wait()
    

    </编辑>

    【讨论】:

      猜你喜欢
      • 2022-12-14
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多