nodemon 在 cmd 中工作而不在批处理文件中工作的原因是什么?

What is the reason for nodemon working in cmd but not in a batch file?

我正在制作一个不和谐的机器人。我为机器人编写的所有代码都可以工作,除了应该 运行 它的批处理文件。最初我只是使用 node 命令,当我打开 cmd,导航到文件夹并手动输入它时它工作正常,但是当我将相同的代码放入批处理文件时它给了我这个错误:

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

这是该批处理文件的所有代码:

@echo off
node bot.js
pause

节点命令在我的路径中,所以我不确定为什么它不起作用,但在另一个 post 中,有人建议不要只键入 node 来键入完整的文件路径,所以我尝试了这个并且成功了。

这是新的工作代码:

@echo off
"C:\Program Files\nodejs\node.exe" bot.js
pause

然后我安装了nodemon。当我导航到该文件夹​​并手动键入它时,这在 cmd 中再次起作用,但是当我尝试在批处理文件中执行它时,它不起作用。在 window 立即关闭之前,它没有给我错误。这是代码:

@echo off
nodemon bot.js
pause

因为我在代码末尾有暂停命令,所以如果出现错误,它应该停在那里,但由于某种原因它在到达那里之前就关闭了。 nodemon 命令在我的路径中,我也尝试用文件路径 C:\Users\tdkni\AppData\Roaming\npm\nodemon.cmd 替换 nodemon,就像我在之前的 post 中被推荐的那样。这些解决方案都不起作用,我认为这是因为除了未检测到 nodemon 命令之外还有其他一些问题。我没有看到任何错误消息,因为它会立即关闭,所以我不知道到底出了什么问题。

.bat.cmd文件扩展名的注册根据同时删除的评论中的建议如下。

请为我们尝试一下,如果有效,我会解释:

@echo off
cd /d "C:\Users\tdkni\AppData\Roaming\npm"
echo Testing Script > OUTPUT.log
nodemon.cmd bot.js >> OUTPUT.log
pause

感谢大家帮助我解决我遇到的这个问题。你们都非常有帮助,虽然它可能没有解决我的问题,但确实帮助我理解了所有这些是如何工作的。我只是尝试使用我制作的批处理文件启动机器人,它突然工作了。我不知道为什么,因为我试图以一直以来的方式启动它,但据我所知,反正没有其他人遇到过这个问题,所以我不这样做可能并不重要不知道是什么修复了它。再次感谢所有帮助过我的人。

嗯,很清楚为什么 cmd.exe 在目录 C:\Program Files\nodejs 中找不到 node.exe

Local Pathsystemuser Path连接包含 "C:\Program Files\nodejs;" 而不仅仅是 C:\Program Files\nodejs.

Path 中的文件夹路径不应用双引号引起来,但有一个例外:文件夹路径本身包含一个或多个 ;。在这种情况下,带有 ; 的文件夹路径必须用双引号引起来,以使文件夹路径中的分号不被解释为文件夹路径之间的分隔符。这是维基百科文章 comma-separated values 中描述的通用 CSV 语法,Windows 使用分号作为分隔符 Path 中的文件夹路径。

因此 cmd.exe 在名称为 C:\Program Files\nodejs; 的文件夹中搜索 node.*,文件扩展名在环境变量 PATHEXT 中以分号分隔列出。但是没有文件夹C:\Program Files\nodejs;,因为文件夹是C:\Program Files\nodejs,末尾没有分号。

而且 PATHEXT 定义错误,因为它在末尾包含文件夹路径 C:\Program Files\nodejs 尽管它应该只包含用分号分隔的文件扩展名。

其他小错误:

  1. 系统中的前4个文件夹路径PATH应该总是:

    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\WindowsPowerShell\v1.0
    

    一些安装程序在文件夹路径列表的开头添加文件夹路径,而不是将它们附加在末尾,如此处所示。 Intel64 编译器和 Oracle Java 文件夹路径应移至 system PATH 后 PowerShell 文件夹路径。

  2. 文件夹路径可以但不应该以反斜杠结尾。应从 systemuser PATH 中删除文件夹路径末尾的所有反斜杠。自 Windows Vista 以来,Microsoft 出于某种未知原因添加了带有尾部反斜杠的 PowerShell 路径。但仍然建议在 WindowsPowerShell\v1.0.

  3. 后删除反斜杠是安全的
  4. Systemuser Path(如果后者存在的话)还有 PATHEXT 不应以分号结尾。最后一个文件夹路径和最后一个文件扩展名后不应有 ;,因为根据 CSV 规范,这意味着还有一个空值(文件夹路径、文件扩展名)。

我建议定义 system Path 分别使用以下值文件夹路径:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\WindowsPowerShell\v1.0;%SystemRoot%\System32\OpenSSH;%ProgramFiles(x86)%\Common Files\Intel\Shared Libraries\redist\intel64\compiler;%ProgramFiles(x86)%\Common Files\Oracle\Java\javapath;%ProgramFiles%\nodejs;%ProgramFiles(x86)%\Windows Kits.1\Windows Performance Toolkit

我建议定义 user Path 分别使用以下值文件夹路径:

%LocalAppData%\Microsoft\WindowsApps;%AppData%\npm

这两个文件夹路径与用户帐户相关,因此应添加到 user 而不是 system Path .

我建议将系统环境变量PATHEXT修复为:

.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

有关 PathPATHEXT 用法的更多详细信息,请参阅 Please take also a look on Wikipedia article about Windows Environment Variables 上的答案。

这是我对原始问题的回答,以供其他 Windows 用户使用(Linux/Mac 用户不是我的问题)。

本质上,用户正在尝试 运行 一些 script.js 文件与 nodemon;

C:\path\to\my\project>nodemon bot.js

,想放入一个批处理文件。

如果全局安装 nodemon -g,它会安装在

C:\Users\<YourLogin>\AppData\Roaming\npm\nodemon.cmd

所以你的批处理文件应该是

cd C:\path\to\my\project\
%AppData%\npm\nodemon.cmd bot.js
PAUSE press any key to exit

我知道这个帖子比较旧,但我今天遇到了同样的问题。如果像我这样的人偶然发现,根据 joedotnot 的回答,这就是它为我解决的问题。

devserver.cmd
@echo off
echo Auto Starting Development Server
cmd /k "cd x:\cmdproxy & config\env.cmd & %AppData%\npm\nodemon.cmd"

其中 X: 是映射为开发客户机系统中的网络驱动器的 VM 主机系统上的开发文件夹。 config\env.cmd 是另一个包含一些环境设置的批处理文件。

我的服务器文件名为 index.js,因此无需添加 is 作为参数。 Nodemon 自动找到文件。