Есть одна неочевидная и малоизвестная особенность при запуске задач через планировщик заданий Windows (Task Scheduler). Если пользователь запустит одно и то же задание (команду, скрипт), интенсивно использующее ресурсы компьютера, вручную из командной строки (интерактивно) и через планировщик, можно заметить, что задание, запущенное через Task Scheduler, выполняется заметно дольше. Дело в том, что планировщик по умолчанию запускает любые задания с низким приоритетом, в результате на нагруженных системах такое задание будет получать меньше процессорного времени и соответственно, выполнятся медленнее.
Чтобы понять, с каким приоритетом запущен процесс, откройте Task Scheduler, на вкладке Details найдите исполняемый файл процесс и в контекстном меню выберите пункт Set priority. Отсюда можно изменить текущий приоритет процесса и посмотреть с каким приоритетом выполняется данный процесс сейчас (либо можно добавит отдельный столбец Base Priority прямо в список процессов в Task Manager).
На первом скриншоте показан процесс
python.exe
, который выполняет py скрипт и запущен из задания Task Scheduler. Как вы видите, этот процесс имеет низкий приоритет выполнения (Below normal).

Если же этот самый Python скрипт запустить интерактивно, то он будет выполнятся с обычным приоритетом процесса (Normal).

В настройках задания планировщика отсутствует опция для настройки приоритета выполнения задания. В ранних версиях Windows приоритет задания можно было изменить ручным редактированием XML файла с настройками задания.
- Откройте консоль Task Scheduler
taskschd.msc - Найдите ваше задание, выберите его и экспортируйте его в XML файл

- Откройте XML файл задания с помощью любого тестового редактора. В разделе
Priorityуказан текущий приоритет задания. По умолчанию это 7, означающее приоритет ниже среднего.
- Для повышения приоритета процесса этого задания, измените это значение на 5 (выше среднего).Приоритет задания планировщика задается в диапазоне от 0 до 10, где
0это максимальный приоритет (realtime), а10– самый низкий (фоновый). - Сохраните изменения в XML файле, удалите в консоли планировщика старое задание и импортируйте отредактированное задание из вашего XML файла (Action -> Import Task).

- Теперь при запуске такого задания через Task Scheduler оно будет запускаться с более высоким приоритетом (Below Normal).

Однако, если вы отредактируйте любую из опций этого задания через графическую консоль планировщика задач Windows, его приоритет опять будет сброшен на низкий (7). Поэтому придется еще раз экспортировать задания в XML файл, отредактировать и снова импортировать в консоль.
Начиная с версии PowerShell 3.0 в Windows появился встроенный модуль ScheduledTasks для управления заданиями планировщика. В этом модуле доступе командлет для управления приоритетами заданий Task Scheduler.
Чтобы изменить приоритет определенного задания, укажите его имя в следующем PowerShell скрипте:
$myTaskName=”py_Task_InspectResult”
$myPriority = New-ScheduledTaskSettingsSet -Priority 5
Set-ScheduledTask -TaskName $myTaskName -Settings $myPriority

Чтобы узнать текущий приоритет задания, выполните:
$task = Get-ScheduledTask -TaskName ”py_Task_InspectResult”
$task.Settings.Priority

Если вы изменили приоритет задания с помощью командлетов New-ScheduledTaskSettingsSet и Set-ScheduledTask, он не будет сброшен при ручном редактирований параметров задания через оснастку Task Scheduler.
Если вы распространяете задание планировщика на компьютеры пользователей через доменные GPO, приоритет можно изменить в XML файле с настройками политики в каталоге SYSVOL. Найдите папку GPO по ее ID в SYSVOL и перейдите в директорию
Machine
или
User\Preferences\ScheduledTasks
. Откройте файл SheduledTasks.xml и отредактируйте значение параметра
Priority
в разделе
<Settings>
.



Это не совсем безопасно .
Главная проблема: New-ScheduledTaskSettingsSet -Priority 5 создаёт новый объект настроек, где явно указан только приоритет, а все остальные параметры (StartWhenAvailable, AllowStartIfOnBatteries, DisallowStartIfOnBatteries, ExecutionTimeLimit, MultipleInstances и т.д.) выставляются в дефолтные значения модуля, а не берутся из текущей задачи.