Изменение приоритета процесса Windows через командную строку

Ответы:

55

Синтаксис командной строки:

wmic process where name="AppName" CALL setpriority ProcessIDLevel

Пример:

wmic process where name="calc.exe" CALL setpriority 32768

или

wmic process where name="calc.exe" CALL setpriority "above normal"

Приоритет:

  • холостые: 64 (или «холостые»)
  • ниже нормы: 16384 (или «ниже нормы»)
  • нормальный: 32 (или «нормальный»)
  • выше нормы: 32768 (или «выше нормы»)
  • высокий приоритет: 128 (или «высокий приоритет»)
  • в реальном времени: 256 (или «в реальном времени»)
Bobs
источник
7
Вы также можете использовать подстановочные знаки wmic process where "CommandLine like '%calc%'" CALL setpriority "below normal"
laggingreflex
Можно ли сделать то же самое для фона (низкий IO и приоритет памяти), как в Process Explorer?
Майки
это будет работать даже на "cmd.exe" из партии? ... пакет, который запустит этот cmd.exe?
gamer0
Примечание: первый набор кавычек является обязательным, поэтому в других оболочках кавычки должны быть экранированы (или заключены в двойные кавычки). В Cygwin:wmic process where 'name="calc.exe"' CALL setpriority "idle"
piojo
2
почему ниже / выше нормальное значение такое большое и странное? И почему обычно меньше, чем в режиме ожидания и в реальном времени?
phuclv
11

Небольшое дополнение.

Вы также можете использовать строковые значения вместо целых чисел (легче запомнить), например:

 wmic process where name="calc.exe" CALL setpriority "idle"

Возможные значения: «холостой», «низкий», «ниже нормы», «нормальный», «выше нормы», «высокий приоритет», «реальное время»

PS. Не забывайте кавычки, особенно если вы используете несколько слов в строковом значении

пепельница
источник
Первый набор кавычек является обязательным, даже если не использовать несколько слов. Он также должен передаваться команде, а не интерпретироваться оболочкой.
piojo
На win10 Pro 1809 «low» не является распознанным значением - выдает ошибку. использование «Idle» приводит к тому, что процесс отображается как «низкий» приоритет в диспетчере задач ...
ljwobker
5

Из командной строки я бы просто использовал PowerShell. Этот пример запускает calc.exe, находит его процесс и настраивает его класс приоритета на «IDLE», то есть LOW:

start /b /wait powershell.exe -command "calc.exe;$prog = Get-Process -Name calc;$prog.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::IDLE"

Укажите одно из следующих значений перечисления: " Normal, Idle, High, RealTime, BelowNormal, AboveNormal"

Вот то же самое из PowerShell с разделенными линиями:

calc.exe
$prog = Get-Process -Name calc
$prog.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::IDLE
Knuckle-Dragger
источник
Какой смысл повторять то, что уже было сказано раньше?
harrymc
@harrymc Он отвечает на оригинальный вопрос, используя PowerShell.
paradroid
@harrymc - на самом деле я повторяю то, что я сказал из DEC. stackoverflow.com/questions/20693028/…
Knuckle-Dragger
Нет проблем. Просто я связал что-то похожее
harrymc
5

В дополнение к существующим ответам на вопрос Windows Equivalent of «nice» перечисляются еще некоторые решения:

  1. Использование команды START в командной строке (CMD).
  2. Использование бесплатного ProcessTamer для настройки правила для EXE-файла, которое автоматически применяется при каждом запуске этого процесса.
  3. Использование скрипта PowerShell, содержащегося здесь .
  4. Использование сценария VBScript, содержащегося здесь .

Кроме того, старая утилита SetPriority может все еще работать, но я не пробовал ее уже много лет.

Некоторые из этих решений могут не работать с системными службами или могут быть запущены от имени администратора .

harrymc
источник
Очевидное препятствие для решения vbScript состоит в том, что для выполнения своей задачи (т.е. установки уровня приоритета) требуется 23 строки кода, где для выполнения команды START требуется всего 2 строки (одна - в крайнем случае, следовательно, она даже работает в
пустая командная строка
1

Я использую 64-разрядную версию Windows 7.

WMIC команда не надежен. По моему значительному опыту, он неожиданно потерпел неудачу по слишком многим (главным образом необъяснимым) причинам.

Лучшая команда из-за своей надежности - это команда START. Синтаксис очень прост (это команда запуска из 3 строк для пакетного файла ):

::  Boost thread priority
SET command=<program.exe> <options>
start "" /REALTIME /B /W  %command%

По моему мнению, его высокая степень надежности проистекает из того факта, что он устанавливает уровень приоритета, с которым запускается программа .exe, а не пытается вмешиваться с приоритетом после запуска программы с другим приоритетом.

Ed999
источник