Для запуска заданий в фоновом режиме в powershell, есть 3 способа go об этом
1. Invoke-Command<sup>[3]</sup> -scriptblock { script } -asJob -computername localhost
2. Start-Job<sup>[2]</sup> -scriptblock { script }
3. Start-Process<sup>[1]</sup> powershell {script}
Если вы действительно хотите запускать задания в фоновом режиме, когда каждое задание не зависит друг от друга, вам придется подумать об использовании первого или второго параметра, поскольку ни один из них не требует вывода для записи в файл.
Invoke-Command запускает новый сеанс с системой и запускает задание в новом экземпляре.
Start-Job создает новое задание в фоновом режиме под новым экземпляром powershell, занимает немного больше времени для выделения ресурсы и начать процесс. Как и start-process, Start-Job будет запускать задание в отдельном экземпляре powershell.exe.
Start-Process требует, чтобы вы перенаправили стандартный вывод в файл [ 1] . Вы должны полагаться на производительность диска и скорость чтения и записи. Вы также должны убедиться, что не более одного потока читает / записывает на выходе этого процесса.
Рекомендация Я нашел Invoke-Command
как самый быстрый при запуске 100 одновременных заданий для получения информации о процессоре. Эта опция требует, чтобы вы указали -ComputerName, который затем требует, чтобы вы были администратором, чтобы запустить сеанс winrm с localhost. Если вы не выводите информацию о задании при создании заданий, это не отнимает значительного времени.
Start-Job и Invoke-Command оба заняли около секунды, чтобы получить информацию о процессоре, и запустили 100 параллельных заданий для получить то же самое, потребовалось некоторое время.
$x = 0..100 | Invoke-Command -computername localhost -scriptblock { script } -asJob
$x | % { $_ | wait-job | out-null }
$output = $x | % { $_ | Receive-Job}
# You can run measure-object, sort-object, etc as well
[1] Start-Process
RedirectStandardOutput: указывает файл. Этот командлет отправляет выходные данные, сгенерированные процессом, в указанный вами файл. Введите путь и имя файла. По умолчанию вывод отображается на консоли.
[2] Start-Job
Командлет Start-Job запускает фоновое задание PowerShell на локальном компьютере. ... Фоновое задание PowerShell запускает команду, не взаимодействуя с текущим сеансом.
[3] Invoke-Command
Командлет Invoke-Command выполняет команды на локальном или удаленном компьютере и возвращает все выходные данные команд, включая ошибки. ... Для запуска команды в фоновом задании используйте параметр AsJob