Windows 使用参数启动多个exe
我有大约5000个文件夹,每个文件夹包含一个dos可执行文件和必需的文件。 目前我正在使用for循环调用下面的代码。一个接一个地执行需要很长时间,因为每次执行大约需要5秒。 是否有一个可以同时执行所有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
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"
)