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 Path
是 system 和 user 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
尽管它应该只包含用分号分隔的文件扩展名。
其他小错误:
系统中的前4个文件夹路径PATH
应该总是:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\WindowsPowerShell\v1.0
一些安装程序在文件夹路径列表的开头添加文件夹路径,而不是将它们附加在末尾,如此处所示。 Intel64 编译器和 Oracle Java 文件夹路径应移至 system PATH
后 PowerShell 文件夹路径。
文件夹路径可以但不应该以反斜杠结尾。应从 system 和 user PATH
中删除文件夹路径末尾的所有反斜杠。自 Windows Vista 以来,Microsoft 出于某种未知原因添加了带有尾部反斜杠的 PowerShell 路径。但仍然建议在 WindowsPowerShell\v1.0
.
后删除反斜杠是安全的
System 和 user 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
有关 Path
和 PATHEXT
用法的更多详细信息,请参阅 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 自动找到文件。
我正在制作一个不和谐的机器人。我为机器人编写的所有代码都可以工作,除了应该 运行 它的批处理文件。最初我只是使用 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 Path
是 system 和 user 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
尽管它应该只包含用分号分隔的文件扩展名。
其他小错误:
系统中的前4个文件夹路径
PATH
应该总是:%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\WindowsPowerShell\v1.0
一些安装程序在文件夹路径列表的开头添加文件夹路径,而不是将它们附加在末尾,如此处所示。 Intel64 编译器和 Oracle Java 文件夹路径应移至 system
PATH
后 PowerShell 文件夹路径。文件夹路径可以但不应该以反斜杠结尾。应从 system 和 user
PATH
中删除文件夹路径末尾的所有反斜杠。自 Windows Vista 以来,Microsoft 出于某种未知原因添加了带有尾部反斜杠的 PowerShell 路径。但仍然建议在WindowsPowerShell\v1.0
. 后删除反斜杠是安全的
System 和 user
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
有关 Path
和 PATHEXT
用法的更多详细信息,请参阅
这是我对原始问题的回答,以供其他 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 自动找到文件。