Вчера я экспериментировал с OCaml и opam в своей системе Windows без использования установщика - я просто поместил двоичные файлы в папку. Некоторое время спустя я удалил двоичные файлы. Теперь, когда я запускаю какой-либо пакетный файл только в PowerShell, я получаю следующее:

C:\> .\test.bat
'opam' is not recognized as an internal or external command,
operable program or batch file.
"Hi!!"

Вот содержимое test.bat, но это происходит с любым командным файлом, который я выполняю:

@echo off

echo "Hi!!"

Как видно из вывода в PowerShell, похоже, что была предпринята попытка выполнить opam, которая, конечно же, не может быть найдена, поскольку двоичные файлы удалены. Затем пакетный файл работает нормально. Обратите внимание, что это не происходит при запуске командного файла с cmd.exe.

Что здесь происходит, и как я могу это исправить?

1 ответ1

3

Хорошо, я нашел ответ:

Существует несколько малоизвестных ключей реестра, которые cmd.exe ищет для автоматического запуска скриптов или команд при запуске. Ключевым вопросом был HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun . По-видимому, когда я запускал opam, он помещал opam configure --autorun в этот раздел реестра. Таким образом, всякий раз, когда я запускал cmd.exe или запускал командный файл в PowerShell (который вызывал cmd.exe для его запуска), он пытался запустить команду с этим ключом. Так как opam был удален (и удален из системного PATH), я получал

'opam' is not recognized as an internal or external command,
operable program or batch file.

О существовании этого ключа реестра я узнал в блоге Caelum.

Если вы cmd /? текст справки перечислит ключи реестра, которые он ищет. Текст справки (в Windows 10) гласит:

If /D was NOT specified on the command line, then when CMD.EXE starts, it
looks for the following REG_SZ/REG_EXPAND_SZ registry variables, and if
either or both are present, they are executed first.

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

        and/or

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun

Итак, чтобы решить эту проблему, я искал раздел реестра и удалил его. Проблема сейчас больше не возникает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .