배치 파일에선 실패하고 직접 실행하면 성공하는 프로그램의 비밀
원제 Why a program doesn't work when run from a batch file, but works when clicked
103 포인트댓글 54
Key Point
배치 파일과 직접 실행의 동작 차이는 실행 컨텍스트(작업 디렉토리, 환경변수)가 다르기 때문인데, 이 글은 절대 경로 대신 실행 파일 위치 기반의 동적 경로 해석으로 환경에 상관없이 일관되게 작동하게 하는 실전 기법을 보여준다.
핵심 요약
- Windows 환경에서 배치 파일로 실행할 때와 직접 클릭했을 때 프로그램 동작이 달라지는 문제의 원인과 해결책을 다룬다.
- 현재 실행 파일 경로를 GetModuleFileNameA로 확인해 애플리케이션이 자신의 실행 환경을 파악하도록 설계하는 방법을 제시한다.
- 설정과 자산 파일의 경로를 실행 파일이 위치한 디렉토리 기준으로 상대 경로로 지정하고, 배치 파일이든 직접 실행이든 일관되게 찾을 수 있도록 한다.
- SHGetKnownFolderPath를 사용해 사용자의 LocalAppData 폴더 경로를 동적으로 구하고, 여기에 애플리케이션 이름으로 폴더를 만들어 데이터베이스와 설정을 저장한다.
- copy_if_newer 함수로 시작 시 로컬 자산을 LocalAppData 경로로 복사하며, 대상이 없거나 소스가 더 최신이면 덮어쓴다.
- JSON 설정 파일에서 서버 정보와 애플리케이션 이름을 읽어 초기화하고, 마지막으로 서비스 객체를 생성해 UI를 실행한다.
- 예외 발생 시 파일명과 줄 번호를 포함한 상세한 에러 메시지를 로그로 남겨 디버깅을 용이하게 한다.