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

如何在Windows命令行中实现脚本并行运行?

当然有!Windows的命令行环境(不管是传统CMD还是PowerShell)都能实现类似Linux/Mac下的并行脚本运行需求,我分你提到的两种场景具体说说:

场景1:重复运行同一脚本多次(模拟随机任务)

对应Linux里for i in {1..10}; do python script.py & ; done的需求,Windows有两种实现方式:

传统CMD命令行

用start /b命令在后台启动进程,不会弹出新窗口:

# 直接在CMD窗口执行的版本
for /l %i in (1,1,10) do start /b python script.py

如果是写在批处理(.bat)文件里,变量要改成双百分号:

@echo off
for /l %%i in (1,1,10) do start /b python script.py

这里/l表示按数字序列循环,(1,1,10)代表从1开始,步长1,到10结束。

PowerShell

PowerShell的灵活性更高,有两种常用方式:

用Start-Process后台运行

1..10 | ForEach-Object { 
    Start-Process python -ArgumentList "script.py" -NoNewWindow -PassThru 
}

-NoNewWindow让进程在当前窗口后台运行,-PassThru可以返回进程对象,方便后续查看状态。

用后台作业(Job)

如果需要跟踪任务状态或收集输出,用Start-Job更合适:

# 启动10个后台作业
1..10 | ForEach-Object { 
    Start-Job -ScriptBlock { python script.py } 
}

# 查看所有作业状态
Get-Job

# 等待所有作业完成并获取输出
Wait-Job -Job (Get-Job)
Receive-Job -Job (Get-Job)
场景2:并行处理多个文件(如.npy文件)

对应Linux里ls *.npy | xargs -P4 -n1 python script.py的需求(限制4个并发任务),Windows的实现如下:

传统CMD命令行

CMD原生没有直接控制并发数的参数,但可以用start /b批量启动进程:

for %f in (*.npy) do start /b python script.py "%f"

不过这个命令会一次性启动所有文件对应的进程,如果文件很多可能会占满资源。如果需要控制并发数,得自己写批处理逻辑(比如用计数器和进程等待),相对麻烦一点。

PowerShell(推荐,支持并发数控制)

PowerShell可以轻松实现固定并发数的文件处理,这里以限制4个并发任务为例:

用Start-Process控制并发

$files = Get-ChildItem -Filter *.npy
$maxConcurrent = 4
$runningProcesses = @()

foreach ($file in $files) {
    # 等待直到运行中的进程数小于最大并发数
    while ($runningProcesses.Count -ge $maxConcurrent) {
        # 过滤掉已经结束的进程
        $runningProcesses = $runningProcesses | Where-Object { !$_.HasExited }
        Start-Sleep -Milliseconds 500
    }
    # 启动新的处理进程
    $process = Start-Process python -ArgumentList "script.py `"$($file.FullName)`"" -NoNewWindow -PassThru
    $runningProcesses += $process
}

# 等待最后一批进程完成
Wait-Process -InputObject $runningProcesses

用后台作业(Job)控制并发

如果需要收集每个任务的输出,用Job更方便:

$files = Get-ChildItem -Filter *.npy
$maxConcurrent = 4
$jobs = @()

foreach ($file in $files) {
    # 控制并发数
    while ((Get-Job -State Running).Count -ge $maxConcurrent) {
        Start-Sleep -Milliseconds 500
    }
    # 启动处理文件的后台作业
    $job = Start-Job -ScriptBlock { python $args[0] } -ArgumentList $file.FullName
    $jobs += $job
}

# 等待所有作业完成并获取输出
Wait-Job -Job $jobs
Receive-Job -Job $jobs

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:12:42