이것은 다른 우선 순위에서 배치 우선 순위를 설정하는 데 사용할 수 있는 작업 입니다. 디렉토리를 디렉토리에 복사 하면 필요할 때 언제든지 호출 할 수 있습니다. TOOGAM 덕분에이를 작성 하는 도구와 방법을 얻을 수있었습니다. 변수를 사용 하면 정확히 지정된 프로세스가 배치의 다른 인스턴스 (정확하지는 않지만 가능한 시나리오)가 아니라 정확히 필요한 것입니다.SetMyPrio.bat
MyPrio.bat
%PATH%
UniqueString
@echo off
GOTO :EndOfReminder
<HELP>
USAGE:
From any batch file or command prompt, write
CALL MyPrio [/?|/h] [<priority>|get]
to set the priority of the caller cmd. Default for <priority> is idle.
/?, /h This help.
<priority> If you want your priority change to
idle -- no parameter, 64, idle or "idle"
below normal -- 16384 or "below normal"
normal -- 32, normal or "normal"
above normal -- 32768 or "above normal"
high priority -- 128 or "high priority"
real time -- 256, realtime or "realtime"
get Returns current priority as errorlevel
TO DO
- Parameter error control.
- Support for Unicode characters in help.
</HELP>
:EndOfReminder
setlocal
set Priority=%~1
if /I ["%Priority%"]==["/h"] ( call :PrintHelp & exit /b )
if ["%Priority%"]==["/?"] ( call :PrintHelp & exit /b )
set UniqueString=%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%
if ["%Priority%"]==["get"] for /f "usebackq tokens=2 delims==" %%a in (`wmic Process WHERE "name='cmd.exe' AND CommandLine LIKE '%%%UniqueString%%%'" Get Priority /format:LIST`) do exit /b %%a
if not defined Priority set Priority=idle
for /f "usebackq tokens=2 delims==" %%a in (`wmic Process WHERE "name='cmd.exe' AND CommandLine LIKE '%%%UniqueString%%%'" Get ParentProcessID /format:LIST`) do set myPID=%%a
wmic process where "ProcessId='%myPID%'" CALL setpriority "%Priority%" > nul 2>&1
endlocal
goto :eof
:PrintHelp
setlocal DisableDelayedExpansion
call :eln 0
set "levelerror=^%%errorlevel^%%"
for /F "delims=" %%a in ('find /v /n "" "%~f0"') do (
set "line=%%a"
REM We store errorlevel in tmpel because setlocal will set errorlevel to 0...
call set tmpel=%levelerror%
setlocal EnableDelayedExpansion
REM ... and now we restore it
REM %levelerror% was expanded to %errorlevel% before running the iteration
REM and the CALL SET allows actual errorlevel be stored in tmpel
REM Finally, we set errorlevel again
call :eln !tmpel!
set "line=!line:*]=!"
if /i "!line!"=="</HELP>" exit /b 0
if errorlevel 1 echo(!line!
if /i "!line!"=="<HELP>" call :eln 1
REM errorlevel is the only value that survives the following endlocal
endlocal
)
exit /b 1
:eln
REM Sets errorlevel to %1
exit /b %1
편집 (2018-06-12)
- 로 이름을 변경 MyPrio , 옵션을 추가
/?
, /h
하고 get
.
- 옵션
/?
과 /h
당신 사이의 알림에 쓰기 텍스트 인쇄 <HELP>
와 </HELP>
. 이 방법은 필요한 다른 배치에서 재사용 할 수 있습니다.
MyPrio.bat
배치 시작시 전화를 걸면 명령 줄에서 시작하거나 매개 변수가되는 Windows 탐색기에서 파일을 끌어다 놓아도 배치의 모든 부분 (및 하위 프로세스)이 실행됩니다. 원하는 우선 순위.
예를 들면 다음과 같습니다.
@echo off
call MyPrio
REM Here comes a set of commands that will run with idle priority.
call MyPrio normal
REM Here may come some interactive part to request information needed to continue.
call MyPrio
REM Back to idle (or put any other priority you prefer).
call MyPrio normal
REM You may want to set the priority to normal at the end just in case you call the batch from a command line.
코멘트
가능한 모든 옵션 PrioTest.bat
으로 테스트 할 배치 이름 을 지정 하고 MyPrio.bat
모든 호출이 우선 순위를 다른 것으로 변경하도록 주문했습니다. 나는 다음과 같은 서브 루틴 ( :test1
)을 만들었다 :
1. 현재 우선 순위를 가져 와서에 저장하십시오 myPrioBefore
.
2.MyPrio
테스트 매개 변수를 사용하여 호출 합니다.
3. 새로운 우선 순위를 가져 와서에 저장하십시오 myPrioAfter
.
4. 숨겨진를 시작합니다 ping -t localhost
.
5. 의 우선 순위와 PID를 가져옵니다 ping
공정과에 저장
pingPrio
하고 pingPID
.
6. 값 인쇄 myPrioBefore
, 호출 MyPrio
,
myPrioAfter
및 pingPrio
.
7. 시작된 것을 종료합니다 ping
(다른 것이 아닌지 확인).
@echo off
setlocal
set UniqueString=%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%
for /f "usebackq tokens=2 delims==" %%a in (`wmic Process WHERE "name='cmd.exe' AND CommandLine LIKE '%%%UniqueString%%%'" Get ParentProcessID /format:LIST`) do set myPID=%%a
for %%a in (64 16384 32 32768 128 256 idle "below normal" none normal "idle" "normal" "above normal" realtime "high priority" "realtime") do call :test1 %%a
CALL MyPrio normal
endlocal
goto :eof
:test1
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "ProcessID='%%myPID%%'" Get Priority /format:LIST`) do set myPrioBefore=%%b
if [%1]==[none] ( call MyPrio ) else ( call MyPrio %1 )
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "ProcessID='%%myPID%%'" Get Priority /format:LIST`) do set myPrioAfter=%%b
start "" /b ping -t localhost > nul
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "name='ping.exe' AND ParentProcessID='%%myPID%%'" Get Priority /format:LIST`) do set pingPrio=%%b
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "name='ping.exe' AND ParentProcessID='%%myPID%%'" Get ProcessID /format:LIST`) do set pingPID=%%b
echo myPrioBefore==%myPrioBefore% / CALL MyPrio %1 / myPrioAfter==%myPrioAfter% / pingPrio==%pingPrio%
taskkill /f /pid %pingPID% > nul
exit /b
테스터 배치의 출력입니다.
myPrioBefore==4 / CALL MyPrio 64 / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio 16384 / myPrioAfter==6 / pingPrio==6
myPrioBefore==6 / CALL MyPrio 32 / myPrioAfter==8 / pingPrio==8
myPrioBefore==8 / CALL MyPrio 32768 / myPrioAfter==10 / pingPrio==8
myPrioBefore==10 / CALL MyPrio 128 / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio 256 / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio idle / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio "below normal" / myPrioAfter==6 / pingPrio==6
myPrioBefore==6 / CALL MyPrio none / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio normal / myPrioAfter==8 / pingPrio==8
myPrioBefore==8 / CALL MyPrio "idle" / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio "normal" / myPrioAfter==8 / pingPrio==8
myPrioBefore==8 / CALL MyPrio "above normal" / myPrioAfter==10 / pingPrio==8
myPrioBefore==10 / CALL MyPrio realtime / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio "high priority" / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio "realtime" / myPrioAfter==13 / pingPrio==8
보시다시피 myPrioAfter
, 호출에서 요청한 것과 일치하지 않으며 때로는 의 우선 순위가 ping
부모와 같지 cmd
않으므로 더 많은 값이 있어야합니다 (5 번째 줄을보십시오 : 현재 우선 순위는 10, 128을 요청하십시오. 우선 순위는 13이고 하위 프로세스는 8입니다. 죄송합니다.). 또한 realtime
효과가없는 것 같습니다 (관리자 권한 필요).
cmd.exe
PID 를 정확히 지적하기 위해 모두 비등합니다 . 이것은 거의 답입니다. 그러나 지금 나는 이것을 할 수있는 방법을 생각할 수 없습니다. 이 생각을 배경으로 보내겠습니다. 어쩌면 어떤 아이디어가 나타날 수 있습니다.