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
참고 자료
- Application Registration - Win32 apps | Microsoft Learn — https://learn.microsoft.com/en-us/windows/win32/shell/app-registration