프로그램 실행 방법

프로그램 실행 방법 (How to Run Programs)

AutoHotkey의 Run 함수로 프로그램을 실행하고, 명령줄 매개변수와 인용부호·공백, 시스템 동사(verb)를 다루는 방법을 설명하는 문서예요.

출처: 문서

본문

AutoHotkey가 할 수 있는 가장 쉽고 유용한 일 중 하나는 프로그램을 실행하는 키보드 단축키(핫키)를 만들 수 있게 해주는 것이에요.

프로그램은 Run 함수를 호출하고 프로그램의 명령줄을 매개변수로 전달해서 실행돼요:

Run "C:\Windows\notepad.exe"

이 예시는 메모장(Notepad)을 실행해요. 시험해 보는 방법을 배우려면 How to Run Example Code를 참조해요.

이 단계에서는 핫키를 정의하지 않았으므로(즉, 키보드 단축키를 할당하지 않았으므로) 명령이 즉시 수행돼요. 이 경우 스크립트는 할 일이 없으므로 자동으로 종료돼요. 배우는 동안 유용한 핫키를 만드는 것을 선호한다면 How to Write Hotkeys를 먼저 확인해 보세요.

참고: Run은 문서, 폴더 및 URL을 여는 데에도 사용될 수 있어요.

다른 프로그램을 실행하려면 위 예시의 경로를 실행하려는 프로그램의 경로로 바꾸기만 하면 돼요. 일부 프로그램은 경로가 시스템에 등록되어 있어서, 프로그램의 파일 이름만 전달하면 되고 ".exe" 확장자를 붙이거나(가끔) 붙이지 않아도 돼요. 예를 들어:

Run "notepad"

명령줄 매개변수 (Command-line Parameters)

프로그램이 명령줄 매개변수를 받아들인다면, 그것을 Run 함수의 첫 번째 매개변수의 일부로 전달할 수 있어요. 다음 예시는 license.txt를 메모장에서 열어야 해요:


Run "notepad C:\Program Files\AutoHotkey\license.txt"

참고: 이 예시는 AutoHotkey가 기본 위치에 설치되어 있다고 가정하며, 그렇지 않으면 오류를 표시해요.

간단하죠? 이제 파일을 메모장 대신 워드패드(WordPad)에서 열고 싶다고 가정해 봐요.

Run "wordpad C:\Program Files\AutoHotkey\license.txt"

이 코드를 실행하고 결과에서 무엇을 배울 수 있는지 살펴보세요.

네, 새 코드는 동작하지 않아요. 오류 대화 상자를 바로 닫지 않았길 바라요. 오류 대화 상자는 코딩 과정의 정상적인 부분이며, 자주 매우 유용한 정보를 담고 있어요. 이것은 우리에게 몇 가지를 알려줘야 해요:

  • 첫째, 당연한 것: 프로그램을 실행할 수 없었어요.
  • 대화 상자가 "Action"과 "Params"를 보여주는데, "Action" 옆에는 전체 명령줄이 표시되고 "Params"는 비어 있어요. 즉 Run 함수가 프로그램 이름이 끝나고 매개변수가 시작되는 곳을 모른다는 뜻이에요.
  • "지정된 파일을 찾을 수 없습니다" (영어 시스템에서). 아마 시스템이 "wordpad"를 찾을 수 없는 것일 텐데, 실제로 말하는 것은 "wordpad C:..."라는 파일이 없다는 거예요.

그런데 왜 메모장은 동작했을까요? "notepad"나 "wordpad"를 단독으로 실행하는 것은 동작하지만, 그 이유는 달라요. notepad.exe와 달리, wordpad.exe는 PATH 환경 변수에 나열된 각 디렉터리를 검사해서는 찾을 수 없어요. 그것은 Run 함수가 프로그램 이름과 매개변수를 분리해야 하는 다른 방법으로 찾을 수 있어요.

그래서 이 경우 Run 함수는 다음 형태 중 하나라도 도움이 필요해요:

  • ".exe" 확장자를 명시적으로 사용.
  • wordpad.exe의 전체 경로를 명시적으로 사용.
  • 프로그램 이름을 인용부호로 감싸기.

지금은 가장 쉬운 옵션을 사용해요:

Run "wordpad.exe C:\Program Files\AutoHotkey\license.txt"

이제 WordPad가 실행되지만 "C:\Program"을 찾을 수 없다는 오류를 보여줘요.

인용부호와 공백 (Quote Marks and Spaces)

프로그램에 명령줄 매개변수를 전달할 때, 매개변수에 공백이 포함되면 각 매개변수를 인용부호로 감싸야 하는 경우가 많아요. 메모장에서는 필요하지 않았지만, 메모장은 일반적인 규칙의 예외예요. 순진한 해결책 시도는 인용부호를 더 추가하는 것일 수 있어요:

Run "wordpad.exe "C:\Program Files\AutoHotkey\license.txt""

하지만 이것은 동작하지 않아요. 기본적으로 인용부호는 리터럴 텍스트의 시작과 끝을 표시하는 데 사용되기 때문이에요. 그렇다면 명령줄을 끝내지 않고 명령줄 안에 리터럴 인용부호를 어떻게 포함할까요?

방법 1: 각 리터럴 인용부호 앞에 `(백틱, 백쿼트 또는 중음 부호)를 붙여요. 이것을 이스케이프 시퀀스라고 해요. 인용부호는 그런 다음 명령줄(Run 함수에 전달되는 문자열)에 포함되고, 백틱은 그 목적을 다했으므로 빠져요.

Run "wordpad.exe `\"C:\Program Files\AutoHotkey\license.txt`\""

방법 2: 이중 인용부호 대신 명령줄을 단일 인용부호로 감싸요.

Run 'wordpad.exe "C:\Program Files\AutoHotkey\license.txt"'

물론 그 경우 텍스트 안의 리터럴 단일 인용부호(또는 아포스트로피)는 이스케이프(`')해야 해요.

코드를 어떻게 쓰는지가 실제로 Run 함수까지 도달하는 인용부호에 영향을 줘요. 위 두 예시에서 Run 함수는 wordpad.exe "C:\Program Files\AutoHotkey\license.txt" 문자열을 받아요. Run 함수는 이것을 프로그램 이름매개변수(나머지 전부)로 나누거나, 시스템에 맡겨요. 어느 경우든 남은 인용부호가 어떻게 해석될지는 전적으로 대상 프로그램에 달려 있어요.

많은 프로그램은 백슬래시가 앞에 있으면 인용부호를 매개변수의 일부로 취급해요. 예를 들어, Run 'my.exe "A\" B'는 두 개의 매개변수 대신 값이 A" B인 하나의 매개변수를 만들 수 있어요. 이것은 프로그램에 달려 있으며, 보통 Run 'my.exe "A\\" B'처럼 백슬래시를 두 배로 하면 피할 수 있는데, 이것은 보통 두 개의 매개변수(A\B)를 만들어요.

대부분의 프로그램은 인용부호를 일종의 토글로 해석해서 "공백이 매개변수를 끝낸다"와 "공백이 매개변수에 포함된다" 모드를 전환해요. 즉, Run 'my.exe "A B"'는 일반적으로 Run 'my.exe A" "B'와 동일해요. 그래서 슬래시 문제를 피하는 또 다른 방법은 전체 매개변수 대신 공백을 인용하거나, Run 'my.exe "A"\ B'처럼 슬래시 앞에서 인용을 끝내는 것이에요.

변수 포함하기 (Including Variables)

종종 명령줄에 일부 변수를 포함해야 해요. 예를 들어, "Program Files" 디렉터리의 위치는 시스템마다 다를 수 있고, 스크립트는 A_ProgramFiles 변수를 사용해 이것을 고려할 수 있어요. 변수가 전체 명령줄을 담고 있다면, 그 변수를 Run 함수에 전달해 실행하면 돼요.

Run A_ComSpec  *; 명령 프롬프트를 시작함 (거의 항상 cmd.exe).*
Run A_MyDocuments  *; 사용자의 Documents 폴더를 엶.*

인용된 문자열 에 변수를 포함하는 것은 동작하지 않아요. 대신 연결(concatenation)을 사용해 리터럴 문자열을 변수와 함께 이어 붙여요. 예를 들어:

Run 'notepad.exe "' A_MyDocuments '\AutoHotkey.ahk"'

또 다른 방법은 Format을 사용해 치환을 수행하는 것이에요. 예를 들어:

Run Format('notepad.exe "{1}\AutoHotkey.ahk"', A_MyDocuments)

참고: Format은 동시에 추가 서식을 수행할 수 있어요. 예를 들어 0이나 공백으로 패딩하거나, 숫자를 십진수가 아닌 16진수로 서식화하는 것 같은 것 말이에요.

Run의 매개변수 (Run's Parameters)

실행할 명령줄 외에 Run 함수는 그 동작에 영향을 주는 몇 가지 다른 매개변수를 받아들여요.

WorkingDir은 새 프로세스의 작업 디렉터리를 지정해요. 프로그램에 상대 경로를 지정하면 이 디렉터리를 기준으로 해요. 명령줄 매개변수의 상대 경로도 자주 이 디렉터리를 기준으로 하지만, 그것은 프로그램에 달려 있어요.

Run "cmd", "C:\"  *; C:\에서 명령 프롬프트를 엶*

Options는 프로그램이 화면에 튀어나오는 대신 최소화되거나 숨겨진 상태로 실행되게 하는 데 자주 사용될 수 있지만, 일부 프로그램은 무시해요.

OutputVarPID는 프로세스 ID를 주는데, 이는 보통 WinWaitWinWaitActiveahk_pid를 함께 사용해 프로그램이 화면에 창을 보여줄 때까지 기다리거나, 그 창 중 하나를 식별하는 데 사용돼요. 예를 들어:

Run "mspaint",,, &pid
WinWaitActive "ahk_pid " pid
Send "^e"  *; Ctrl+E는 이미지 속성 대화 상자를 엶.*

시스템 동사 (System Verbs)

시스템 동사(system verb)는 시스템이나 응용 프로그램이 특정 파일 유형에 등록하는 동작이에요. 그것들은 보통 탐색기의 파일 오른쪽 클릭 메뉴에서 사용할 수 있지만, 실제 이름이 메뉴에 표시되는 텍스트와 항상 일치하지는 않아요. 예를 들어, AutoHotkey 스크립트에는 스크립트를 편집기에서 여는 "edit" 동사와(Ahk2Exe가 설치되어 있다면) 스크립트를 컴파일하는 "compile" 동사가 있어요.

"Edit"는 Run이 기본적으로 인식하는 일반 동사 목록 중 하나이므로, 아래처럼 단어 뒤에 공백과 파일 이름을 쓰면 사용할 수 있어요:

Run 'edit ' A_ScriptFullPath  *; 일반적으로 Edit와 동일*

시스템에 등록된 어떤 동사든 아래와 같이 * 접두사를 사용해 실행할 수 있어요:

Run '*Compile-Gui ' A_ScriptFullPath

Ahk2Exe가 설치되어 있다면 이것은 현재 스크립트가 미리 선택된 상태로 Ahk2Exe Gui를 열어요.

환경 (Environment)

새 프로세스가 시작될 때마다, 그것은 일반적으로 그것을 실행한 프로세스(부모 프로세스(parent process))의 *환경(environment)*을 상속해요. 이것은 기본적으로 Run으로 실행하는 어떤 프로그램이라도 스크립트의 모든 환경 변수를 상속한다는 뜻이에요.

어떤 경우에는 프로그램을 실행하기 전에 EnvSet으로 환경 변수를 설정해 그 동작에 영향을 주거나 정보를 전달할 수 있어요. 스크립트는 또한 EnvGet을 사용해 부모 프로세스로부터 상속했을 수 있는 환경 변수를 읽을 수 있어요.

64비트 시스템에서 스크립트 자신의 환경은 그것을 실행하는 EXE가 32비트인지 64비트인지에 크게 달라져요. 32비트 프로세스는 환경 변수가 다를 뿐 아니라, 호환성 이유로 파일 시스템 리디렉션(file system redirection)도 적용돼요.

Run "cmd /k set pro"

위 예시는 "pro"로 시작하는 모든 환경 변수를 출력하는 명령 프롬프트를 보여줘요. 32비트 스크립트에서 실행하면 아마 PROCESSOR_ARCHITECTURE=x86ProgramFiles=C:\Program Files (x86)을 볼 거예요. 제목이 "C:\Windows\System32\cmd.exe" 같은 것을 보여주지만 이것은 거짓이에요. 실제로는 "C:\Windows\SysWow64\cmd.exe"에 있는 32비트 버전이에요.

이런 간단한 경우에 "System32"의 리디렉션을 우회하는 가장 쉬운 방법은 "SysNative"를 사용하는 것이에요. 하지만 이것은 64비트 시스템의 32비트 프로세스에서만 동작하므로 조건부로 해야 해요. 아래 예시를 64비트 시스템에서 실행하면, 스크립트가 32비트여도 64비트 명령 프롬프트를 보여줘요:

if FileExist(A_WinDir "\SysNative")
    Run A_WinDir "\SysNative\cmd.exe /k set pro"
else
    Run "cmd /k set pro"

더 알아보기 (Learn more)