Начать несколько exe с аргументами - PullRequest
0 голосов
/ 26 октября 2019

У меня есть около 5000 папок, каждая из которых содержит исполняемый файл dos и необходимые файлы. В настоящее время я использую цикл for для вызова приведенного ниже кода. выполнение по одному занимает много времени, так как каждое выполнение занимает около 5 секунд. Есть ли вариант, где я могу выполнить все исполняемые файлы одновременно?

Любые идеи?

Спасибо

Я пытался использовать

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

в пакетном файле. У input.dat есть аргументы для передачи в exe. но exe открывает новое окно и не принимает аргументы. первый аргумент - «2», запускаемый до определенной части exe, и второй любой номер, чтобы выйти из программы после ее завершения.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Вы пробовали

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"
)
0 голосов
/ 26 октября 2019

Это очень минималистичный скрипт для одновременного запуска N команд из списка. Если вы работаете в поддерживаемой системе Windows, у нее будет PowerShell.

Нет проверки ошибок или правильной справочной информации. Он записывает стандартный вывод в указанный файл журнала, но ничего не делает с кодом выхода из команды. Если что-то не получается, его необходимо определить из файла журнала.

Чтобы использовать это, поместите следующий код в файл Invoke-JobList.ps1

Создайте файл .csv с помощью команд, которые выхотите запустить и другое имя файла журнала для каждой команды. Имя файла журнала не может быть одинаковым для нескольких команд. Если у вас есть 5000 команд для обработки, вам, вероятно, потребуется написать скрипт / программу для его создания.

Я предоставил образец файла .csv и пакетный файл, который я использовал для тестирования. Вам не нужно использовать to.bat.

=== Get-Content. \ 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--
        }
    }
}

=== Get-Content. \ 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

=== Get-Content. \ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...