У меня есть приложение, предоставленное поставщиком, которое необходимо запустить один раз с каждым из нескольких локально сохраненных файлов конфигурации. Я пробовал два разных метода для параллельного запуска этих команд: один медленнее, но работает нормально, второй кажется быстрее, но у меня нет журналов, поэтому я не могу подтвердить, что приложение действительно выполняется.
Этот первый метод определенно работает параллельно. Это намного быстрее, чем старая процедурная версия. Так что это здорово.:
$configList = $(Get-ChildItem E:\Path\*config.ps1 -recurse).FullName
$configList | ForEach-Object -Parallel {
# Get the config and logfile path for each
. $_
Invoke-expression "& E:\dir\app.exe $config" | Out-File -Append -FilePath $logfile
}
Из моего чтения я понимаю, что использование RunspacePool может быть еще быстрее, и он выполняется быстрее, но он не производит никаких записей в моих журналах, поэтому я не могу гарантировать он работает правильно. Любая помощь приветствуется.
$RunspacePool = [runspacefactory]::CreateRunspacePool(1, 5)
$RunspacePool.Open()
$Jobs = @()
$configList = $(Get-ChildItem E:\Path\*config.ps1 -recurse).FullName
$configList | ForEach-Object {
# Get the config and logfile path for each
. $_
$PowerShell = [powershell]::Create()
$PowerShell.RunspacePool = $RunspacePool
$PowerShell.AddScript({Invoke-expression "& E:\dir\app.exe $config" | Out-File -Append -FilePath $logfile})
$Jobs += $PowerShell.BeginInvoke()
}