Hacker News

Why a program doesn't work when run from a batch file, but works when clicked

배치 파일에서만 프로그램이 실패한 이유는 작업 디렉터리였습니다

Explorer에서 더블클릭하면 실행되던 프로그램이 배치 파일에서 오류를 낸 원인은 현재 작업 디렉터리 차이였습니다. 고객은 `pushd`로 프로그램 폴더로 이동해 실행하고 `popd`로 돌아와 문제를 해결했습니다. 실행 파일의 전체 경로를 지정해도 작업 디렉터리는 자동으로 바뀌지 않습니다.

본문

배치 파일에서 실행할 때만 오류가 나던 프로그램은 현재 작업 디렉터리가 달라 필요한 보조 파일을 찾지 못했습니다. Raymond Chen의 Microsoft 블로그 글에 따르면 고객은 배치 파일에서 pushd로 프로그램 폴더로 이동한 뒤 실행하고 popd로 원래 폴더에 돌아오는 방식으로 문제를 해결했습니다.

현재 작업 디렉터리는 프로그램이 상대 경로로 파일을 찾을 때 기준으로 삼는 폴더입니다. 실행 파일을 전체 경로로 지정해도 작업 디렉터리까지 그 실행 파일이 있는 폴더로 바뀌지는 않습니다. 반면 Explorer에서 실행 파일을 더블클릭하면 실행 파일이 든 폴더가 작업 디렉터리가 됩니다. 문서를 더블클릭해 연결된 프로그램을 실행하는 경우에는 문서가 있는 폴더가 기준이 됩니다.

따라서 배치 파일에서는 프로그램을 실행하기 전에 pushd "프로그램 폴더"로 작업 디렉터리를 바꾸고, 실행이 끝난 뒤 popd를 호출하면 됩니다. 글에서 언급한 App Paths 설정은 별개의 기능으로, Shell이 앱을 실행할 때 프로세스의 PATH에 추가 경로를 더합니다. 이번 고객 사례에서 확인된 해결책은 App Paths가 아니라 작업 디렉터리를 바꾸는 것이었습니다.

자료: Microsoft Old New Thing / 정리·해설: Trawling

참고 자료