На серверах Windows (я тестировал 2008 R2 и 2012 R2) мы заметили различное поведение при выполнении сценариев Perl, которые вызываются из пакета.
Рассмотрим примитивный командный файл следующим образом:
:beginlbl
call path\script.pl
goto :beginlbl
Рано или поздно (иногда после нескольких запусков скрипта, в других случаях после сотен запусков) появится сообщение об ошибке: «Windows не может получить доступ к указанному устройству, пути или файлу. Возможно, у вас нет соответствующих разрешений для доступа к элементу».
Если изменить вторую строку кода, чтобы она выглядела следующим образом:
call perl path\script.pl
(Обратите внимание на имя исполняемого файла перед сценарием.) Сценарий будет работать вечно без проблем.
Что Windows выполняет по-разному в двух описанных выше случаях?
Использование ассоциации файлов проходит через процесс оболочки для оценки типа (расширения) файла и запуска соответствующего процесса. Вы, вероятно, подавляете это. Это похоже на то, как вы получаете свой зарегистрированный редактор при вызове .txt. См. Также ShellExecute.
Непосредственный вызов исполняемого файла исключает посредника и всегда будет предпочтительнее.
Комментарий Uslackr к вашему исходному вопросу также верен, и он отмечает, что запускается исполняемый файл perl по системному пути. Лучше всего напрямую указать исполняемый файл, который вы хотите запустить, по полному пути, чтобы избежать случайного вызова другого исполняемого файла. Это хорошо как для надежности, так и для безопасности. В жертву приносится портативность, но вы можете выбирать приоритеты.
Я отметил ответ Мэтью как правильный, поскольку разделяю его мнение о том, как его следует реализовать. На самом деле мы наследуем системы, которые поддерживаем, и лучшее решение - не то, что у нас есть. Изменение / улучшение - это отдельная история.
Сегодня мы знаем, что наша проблема была вызвана неисправным датчиком Crowdstrike. По сути, это шпионское ПО сеет хаос в Windows. Печально то, что а) в журнале событий Windows нет следов вмешательства, б) нет никаких следов вмешательства в собственную консоль Crowdstrike.
К сожалению, поставщик хочет, чтобы мы устраняли проблемы с его собственным программным обеспечением, а мои начальники не платят мне за это.