Windows 使用参数启动多个exe

Windows 使用参数启动多个exe,windows,batch-file,cmd,Windows,Batch File,Cmd,我有大约5000个文件夹,每个文件夹包含一个dos可执行文件和必需的文件。 目前我正在使用for循环调用下面的代码。一个接一个地执行需要很长时间,因为每次执行大约需要5秒。 是否有一个可以同时执行所有exe文件的选项 有什么想法吗 谢谢 我试着用 start "" 1/ddd.exe input.dat start "" 2/ddd.exe input.dat start "" 3/ddd.exe input.dat . . . 在批处理文件中。inp

我有大约5000个文件夹,每个文件夹包含一个dos可执行文件和必需的文件。 目前我正在使用for循环调用下面的代码。一个接一个地执行需要很长时间,因为每次执行大约需要5秒。 是否有一个可以同时执行所有exe文件的选项

有什么想法吗

谢谢

我试着用

   start "" 1/ddd.exe input.dat 
   start "" 2/ddd.exe input.dat 
   start "" 3/ddd.exe input.dat 
   .
   .
   .

在批处理文件中。input.dat具有传递给exe的参数。但是exe打开了一个新窗口,它不接受参数。第一个参数是“2”运行到exe的某些部分,第二个参数是任何数字,以便在程序完成后退出程序。

这是一个非常简单的脚本,可以从列表中一次运行N个命令。如果您在受支持的Windows系统上,它将具有PowerShell

没有错误检查或正确的帮助信息。它将stdout写入指定的日志文件,但不对命令的退出代码执行任何操作。如果出现故障,则需要从日志文件中进行标识

要使用它,请将以下代码放入文件
Invoke JobList.ps1

使用要运行的命令和每个命令的不同日志文件名创建.csv文件。对于多个命令,日志文件名不能相同。如果要处理5000条命令,可能需要编写一个脚本/程序来生成它

我提供了一个示例.csv文件和一个用于测试的批处理文件。您不需要使用
to.bat

==获取内容。\Invoke-JobList.ps1

[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true)]
    [string[]]$jobFile

    ,[Parameter(Mandatory=$false)]
    [int]$nConcurrent = 2
)

$jobs = Import-Csv -Path $jobFile
$jobHash = @{}
$nJobsRunning = 0

foreach ($job in $jobs) {
    if ($nJobsRunning -lt $nConcurrent) {
        Write-Verbose -Message "starting command $($job.command)"
        $j = Start-Job -ScriptBlock ([ScriptBlock]::Create($job.command))
        $jobHash[$j] = $job.logfile
        $nJobsRunning++
    }

    while ($nJobsRunning -ge $nConcurrent) {
        # wait for one or more jobs to state Completed
        $jobsRunning = Get-Job
        foreach ($jobRun in $jobsRunning) {
            if (($null -ne $jobHash[$jobRun]) -and ($jobRun.State -eq 'Completed')) {
                Receive-Job -Job $jobRun | Out-File -FilePath $jobHash[$jobRun]
                Remove-Job -Job $jobRun
                $jobHash.Remove($jobRun)
                $nJobsRunning--
            }
        }
    }
}

Write-Verbose -Message $($nJobsRunning.ToString() + " remaining jobs")

# Wait for all remaining jobs to complete
while ($nJobsRunning -gt 0) {
    $jobsRunning = Get-Job
    foreach ($jobRun in $jobsRunning) {
        if (($null -ne $jobHash[$jobRun]) -and ($jobRun.State -eq 'Completed')) {
            Receive-Job -Job $jobRun | Out-File -FilePath $jobHash[$jobRun]
            Remove-Job -Job $jobRun
            $jobHash.Remove($jobRun)
            $nJobsRunning--
        }
    }
}
==获取内容。\joblist3.csv

command,logfile
C:\src\jobs\to.bat 10,ss-001.txt
C:\src\jobs\to.bat 10,ss-002.txt
C:\src\jobs\to.bat 10,ss-003.txt
C:\src\jobs\to.bat 10,ss-004.txt
C:\src\jobs\to.bat 10,ss-005.txt
C:\src\jobs\to.bat 10,ss-006.txt
C:\src\jobs\to.bat 10,ss-007.txt
==获取内容。\to.bat

@ECHO OFF
SET "TO=%1"
IF "%TO%" == "" (SET "TO=5")
REM Cannot use TIMEOUT command
ping -n %TO% localhost
EXIT /B 0
用参数调用它

.\Invoke-JobList.ps1 -jobFile joblist3.csv -nConcurrent 3 -Verbose
你试过了

for /D %%a in (*) do ( 
  echo processing: %%a 
  start /B "Name" cmd.exe "cd %%a & ddy.exe < parameters.txt"
)

您不太可能有足够的内存来同时执行5000个程序,CPU负载和磁盘I/O的增加将使性能如此糟糕,以至于无法接受。你真的在运行已经死了几十年的DOS吗?DOS应用程序通常以MB为单位测量RAM,而不是GB。您可以创建10个批处理文件,每个批处理500个。我注意到,您似乎也在向每个文件传递一个名为
input.dat
的文件。由于您没有更改或设置当前目录,因此您似乎还希望5000个可执行文件都能使用同一个文件。您确定是否可以将同一文件命中5000次?避免内存和cpu过载。可执行文件非常小,但需要两个输入参数。input.dat就是为了这个。它需要第一个参数“2”,因此它启动程序的特定部分,并在之后退出程序。10个批处理文件,每个500听起来也是个好主意。我只是不喜欢现在5~6小时的运行时间。谢谢你的回答。对不起,我是新手。这在我看来非常复杂:D@ash-很抱歉,这似乎令人困惑。保存
Invoke JobList.ps1
文件。我在答案中添加了一些用法说明。那有用吗?谢谢。我想我是用(*)do(回显处理:%%a开始/B“Name”cmd.exe“cd%%a&ddy.exe为/D%%a运行的。我不确定这是否会更快。@ash-您如何控制同时运行多少次?你的机器能同时运行5000台吗?我刚开始运行。它使用70%的CPU和20%的内存。
for /D %%a in (*) do ( 
  echo processing: %%a 
  start /D "%%a" /min "Name" cmd.exe /c "ddy.exe < parameters.txt"
)