用参数启动多个exe

时间:2019-10-25 21:52:07

标签: windows batch-file cmd

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

有什么想法吗?

谢谢

我尝试使用

<img class="user-image" src="../../../assets/images/user-img.png"> 

在批处理文件中。 input.dat具有传递给exe的参数。但是该exe会打开一个新窗口,并且不接受参数。第一个参数为exe的特定部分为“ 2”,第二个参数为任意数字以在程序完成后退出。

2 个答案:

答案 0 :(得分:0)

这是一个非常简约的脚本,可一次从列表中运行N个命令。如果您使用的是受支持的Windows系统,它将安装PowerShell。

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

要使用此代码,请将以下代码放入文件setup.py bdist_wheel

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

我提供了一个示例.csv文件和一个用于测试的批处理文件。您无需使用Invoke-JobList.ps1

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

to.bat

===获取内容。\ joblist3.csv

[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--
        }
    }
}

===获取内容。\ to.bat

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

使用参数调用它。

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

答案 1 :(得分:0)

您尝试过

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

我希望使用start /D "%%a" /min "Name" cmd.exe /c "ddy.exe < parameters.txt"/B导致它们使用相同的控制台,并且它们可能彼此阻塞。 /D设置工作文件夹(不需要cd),/min最小化窗口以保持屏幕清洁。
另外,请不要忘记使用/c命令来cmd(否则,您将没有并行进程)。

整体上:

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