Process

프로세스에 다음 연산 중 하나를 수행합니다: 존재하는지 점검합니다; 우선순위를 변경합니다; 닫습니다; 끝나기를 기다립니다.

Process, SubCommand , PIDOrName, Value

매개변수

SubCommand, Value
These are dependent upon each other and their usage is described below.
PIDOrName

이 매개변수는 아래에 기술하는 것처럼 숫자 (PID)이거나 프로세스 이름일 수 있습니다. 또 비워 두면 스크립트 자체의 우선 순위를 변경할 수도 있습니다.

PID: Process ID는 특정한 프로세스 하나를 유일하게 식별하는 숫자입니다 (이 숫자는 그 프로세스가 살아 있는 동안에만 유효합니다). 새로 기동된 프로세스의 PID는 Run 명령어를 통하여 알아낼 수 있습니다. 비슷하게, 창의 PID는 WinGet으로 알아낼 수 있습니다. Process 명령어 자체로도 PID를 알아낼 수 있습니다.

Name: 프로세스의 이름은 보통 (경로 없이) 실행 파일의 이름과 같습니다. 예, notepad.exe 또는 winword.exe. 이름은 여러 실행 프로세스에 부합할 수 있기 때문에, 첫 번째 프로세스에만 작동합니다. 이름은 대소문자를 구별하지 않습니다.

부-명령어

For SubCommand, specify one of the following:

Exist

Checks whether the specified process is present.

Process, Exist , PIDOrName

부합하는 프로세스가 존재하면 ErrorLevel에 Process ID (PID)를 설정합니다. 그렇지 않으면 0이 설정됩니다. PIDOrName 매개변수가 비어 있으면, 그 스크립트의 PID가 열람됩니다. 다른 방법으로 스크립트의 PID를 열람하는 한줄 짜리 방법이 있습니다: PID := DllCall("GetCurrentProcessId").

Close

Forces the first matching process to close.

Process, Close , PIDOrName

부합하는 프로세스가 성공적으로 종료하면, ErrorLevel에 그의 이전 Process ID (PID)가 설정됩니다. 그렇지 않으면 (부합하는 프로세스가 없거나 종료에 문제가 있었으면), 0이 설정됩니다. 프로세스는 갑자기 종료하기 때문에 -- 임계 지점에서 그의 작업이 인터럽트 된다거나 그의 창에 데이터를 저장하지 못하고 잃어버린다거나할 가능성이 있기 때문에 -- 이 방법은 그의 창 중에 하나에 WinClose를 사용해서 프로세스를 닫을 수 없을 경우에만 사용해야 합니다.

List

Although this sub-command is not yet supported, example #4 demonstrates how to retrieve a list of processes via DllCall().

Priority

Changes the priority level of the first matching process.

Process, Priority, PIDOrName, Level

Changes the priority (as seen in Windows Task Manager) of the first matching process to Level and sets ErrorLevel to its Process ID (PID). PIDOrName 매개변수가 비어 있으면, 스크립트의 자신의 우선 순위가 변경됩니다. 부합하는 프로세스가 없거나 우선 순위를 변경하는 데 문제가 있었으면, ErrorLevel은 0이 설정됩니다.

Level은 다음 기호나 단어중 하나가 되어야 합니다: L (Low), B (BelowNormal), N (Normal), A (AboveNormal), H (High), R (Realtime). 주의: 실시간 우선 순위를 가지고 실행되도록 설계되지 않은 프로세스는 시스템의 안정성을 훼손할 수 있습니다.

Wait

Waits for the specified process to exist.

Process, Wait, PIDOrName , Timeout

Specify for Timeout the number of seconds (can contain a decimal point) to wait before timing out. If Timeout is omitted, the sub-command will wait indefinitely. 부합하는 프로세스를 발견하면, ErrorLevel에 그의 Process ID (PID)가 설정됩니다. 부-명령어가 시간제한에 걸리면, ErrorLevel에 0이 설정됩니다.

WaitClose

Waits for all matching processes to close.

Process, WaitClose, PIDOrName , Timeout

Specify for Timeout the number of seconds (can contain a decimal point) to wait before timing out. If Timeout is omitted, the sub-command will wait indefinitely. 부합하는 프로세스가 모두 닫히면, ErrorLevel에 0이 설정됩니다. 부-명령어가 시간 제한에 걸리면, ErrorLevel에 여전히 존재하는 첫 번째 부합 Process ID (PID)가 설정됩니다.

ErrorLevel

ErrorLevel is set to 0 if a sub-command failed or timed out. Otherwise, it is set to a Process ID (PID). See the sub-commands above for details.

논평

For the sub-commands Wait and WaitClose: 프로세스는 100 밀리초마다 점검됩니다; 조건이 만족되는 순간, 부-명령어는 기다리기를 멈춥니다. 다른 말로, 시간제한이 경과하기를 기다리지 않고, 즉시 ErrorLevel에 위에 기술한 대로 설정한 다음, 계속해서 스크립트를 실행합니다. 또한, 부-명령어가 대기 상태에 있은 동안에, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드를 기동할 수 있습니다.

Run, WinGet, WinClose, WinKill, WinWait, WinWaitClose, WinExist()

예제

Launches Notepad, sets its priority to "High" and reports its current PID.

Run notepad.exe,,, NewPID
Process, Priority, %NewPID%, High
MsgBox The newly launched Notepad's PID is %NewPID%.

Waits up to 5.5 seconds for Notepad to appear. If Notepad appears within this number of seconds, its priority is set to "Low" and the script's own priority is set to "High". After that, Notepad will be closed and a message box will be shown if it did not close within 5 seconds.

Process, Wait, notepad.exe, 5.5
NewPID := ErrorLevel  ; ErrorLevel이 자주 바뀌기 때문에 값을 즉시 저장합니다.
if not NewPID
{
    MsgBox 지정한 프로세스가 5.5 초 이내에 나타나지 않았습니다.
    return
}
; 그렇지 않으면:
MsgBox 부합하는 프로세스가 나타났습니다 (프로세스 ID는 %NewPID%입니다).
Process, Priority, %NewPID%, Low
Process, Priority,, High  ; 스크립트 자체에 높은 순위를 설정합니다.
WinClose Untitled - Notepad
Process, WaitClose, %NewPID%, 5
if ErrorLevel ; 해당 PID가 여전히 존재합니다.
    MsgBox 프로세스가 5 초 이내에 닫히지 않았습니다.

Press a hotkey to change the priority of the active window's process.

#z:: ; Win+Z 핫키
WinGet, active_pid, PID, A
WinGetTitle, active_title, A
Gui, 5:Add, Text,, 취소하려면 ESCAPE를 누르거나, 다음 창에 대하여 새 우선순위를`n더블 클릭하십시오:`n%active_title%
Gui, 5:Add, ListBox, vMyListBox gMyListBox r5, Normal|High|Low|BelowNormal|AboveNormal
Gui, 5:Add, Button, default, OK
Gui, 5:Show,, Set Priority
return

5GuiEscape:
5GuiClose:
Gui, Destroy
return

MyListBox:
if (A_GuiEvent != "DoubleClick")
    return
; 그렇지 않으면 다음 라벨로 갑니다:
5ButtonOK:
GuiControlGet, MyListBox
Gui, Destroy
Process, Priority, %active_pid%, %MyListBox%
if ErrorLevel
    MsgBox 성공: "%MyListBox%"에 우선순위가바뀌었습니다.
else
    MsgBox 에러: "%MyListBox%"에 우선 순위를 바꾸지 못했습니다.
return

DllCall()을 통하여 실행 프로세스 목록을 열람하고 그 목록을 메시지 상자에 보여줍니다.

d := "  |  "  ; 문자열 가름자
s := 4096  ; 버퍼와 배열의 크기 (4 KB)

Process, Exist  ; ErrorLevel에 실행중인 스크립트의 PID를 설정합니다.
; PROCESS_QUERY_INFORMATION (0x0400)로 이 스크립트의 핸들을 얻습니다:
h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr")
; 다음 프로세스로 조절가능한 접근 토큰을 엽니다 (TOKEN_ADJUST_PRIVILEGES = 32):
DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t)
VarSetCapacity(ti, 16, 0)  ; 특권 구조체
NumPut(1, ti, 0, "UInt")  ; 특권 배열에 있는 한 엔트리...
; 디버그 특권의 지역적으로 유일한 식별자를 열람합니다:
DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid)
NumPut(luid, ti, 4, "Int64")
NumPut(2, ti, 12, "UInt")  ; 다음 특권을 활성 화합니다: SE_PRIVILEGE_ENABLED = 2
; 이 프로세스의 특권을 새 접근 토큰으로 업데이트합니다:
r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0)
DllCall("CloseHandle", "Ptr", t)  ; 이 접근 토큰 핸들을 닫아서 메모리를 절약합니다.
DllCall("CloseHandle", "Ptr", h)  ; 이 프로세스 핸들을 닫아서 메모리를 절약합니다.

hModule := DllCall("LoadLibrary", "Str", "Psapi.dll")  ; 라이브러리를 미리 적재해 수행성능을 높이니다.
s := VarSetCapacity(a, s)  ; 프로세스 식별자의 목록을 받을 배열:
c := 0  ; 프로세스 식별자를 위한 카운터
DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r)
Loop, % r // 4  ; 식별자를 위하여 배열을 DWORD (32 비트)로 분해합니다:
{
    id := NumGet(a, A_Index * 4, "UInt")
   ; 다음으로 프로세스를 엽니다: PROCESS_VM_READ (0x0010) | PROCESS_QUERY_INFORMATION (0x0400)
    h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr")
    if !h
        continue
    VarSetCapacity(n, s, 0)  ; 모듈의 기본 이름을 받을 버퍼:
    e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
    if !e    ; 32-비트 모드일 때 64-비트 프로세스를 위한 대비 방법:
        if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
            SplitPath n, n
    DllCall("CloseHandle", "Ptr", h)  ; 프로세스 핸들을 닫아 메모리를 절약합니다
    if (n && e)  ; 이미지가 널이 아니면 목록에 추가합니다:
        l .= n . d, c++
}
DllCall("FreeLibrary", "Ptr", hModule)  ; 라이브러리를 내려서 메모리를 풀어줍니다.
;Sort, l, C  ; 이 줄을 주석 해제하면 리스트를 알파벳 순서로 리스트를 정렬할 수 있습니다.
MsgBox, 0, %c% Processes, %l%

COM을 통하여 현재 실행 중인 프로세스 목록을 열람합니다.

Gui, Add, ListView, x2 y0 w400 h500, Process Name|Command Line
for proc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    LV_Add("", proc.Name, proc.CommandLine)
Gui, Show,, Process List

; Win32_Process: http://msdn.microsoft.com/ko-kr/library/aa394372.aspx