Это очень минималистичный скрипт для одновременного запуска 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