Рэймонд Чен разбирает обращение пользователя, у которого программа нормально запускалась двойным щелчком в Explorer, но показывала ошибку при вызове из batch-файла. Исполняемый файл был тем же, поэтому причина крылась не в самой программе, а в окружении процесса. Чен сразу предположил, что bat-файл не устанавливает нужный текущий каталог.
При двойном щелчке по документу Explorer назначает программе текущим каталогом папку, в которой находится этот документ. Такое поведение поддерживает приложения, ищущие сопутствующие файлы относительно текущего каталога. Например, условный редактор при открытии ABC.LIT может ожидать рядом файл оглавления ABC.LTC и пользовательский словарь ABC.LDC. Аналогичное правило действует и при двойном щелчке по .exe: текущим становится каталог, содержащий исполняемый файл.
Batch-файл не обязан воспроизводить это окружение. Если он вызывает программу по полному пути, сам исполняемый файл будет найден правильно, но текущий каталог процесса может остаться тем, из которого запущен сценарий. Приложение, обращающееся к ресурсам по относительным путям, тогда не находит их и сообщает об ошибке. Полный путь к .exe сам по себе не меняет рабочую папку нового процесса.
Пользователь подтвердил догадку: явный переход в каталог программы устранил сбой. В сценарии он использовал pushd для смены каталога, а после завершения popd для возврата в прежний. Такая пара удобна тем, что сохраняет исходное состояние командного интерпретатора и не требует вручную запоминать предыдущий путь.
У Чена была и запасная гипотеза, до проверки которой не дошло. Программа могла иметь собственную запись App Paths в Windows. Через неё приложение способно запросить добавление дополнительных каталогов к переменной окружения PATH при запуске. Если такая настройка учитывается в одном способе запуска и не учитывается в другом, это также способно повлиять на поиск зависимостей.
Практический вывод заметки сводится к проверке окружения, а не только команды запуска. Одинаковый исполняемый файл может вести себя по-разному из-за текущего каталога и связанных путей поиска. В подтверждённом случае достаточно было перейти в папку программы перед вызовом и восстановить прежний каталог после него; изменений в самом приложении не потребовалось.