为什么每当我在 PowerShell 中运行任何批处理文件时都会出现“无法识别‘opam’...”?

为什么每当我在 PowerShell 中运行任何批处理文件时都会出现“无法识别‘opam’...”?

昨天我在 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

因此,为了解决这个问题,我查找了注册表项并将其删除。现在问题不再出现。

相关内容