昨天我在 Windows 系统上尝试了 OCaml 和 opam无需使用安装程序—我只是将二进制文件放在一个文件夹中。不久之后,我删除了二进制文件。现在,每当我运行任何批处理文件时仅在 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
好的,我找到了答案:
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
因此,为了解决这个问题,我查找了注册表项并将其删除。现在问题不再出现。