我大约有5000个文件夹,每个文件夹包含一个dos可执行文件和所需文件。 目前,我正在使用for循环调用以下代码。一次执行需要很长时间,因为每次执行大约需要5秒钟。 我可以同时执行所有exe文件吗?
有什么想法吗?
谢谢
我尝试使用
<img class="user-image" src="../../../assets/images/user-img.png">
在批处理文件中。 input.dat具有传递给exe的参数。但是该exe会打开一个新窗口,并且不接受参数。第一个参数为exe的特定部分为“ 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"
)