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

5

0

I am in the process of making a discord bot. All of the code that I have written for the bot works except for the batch file that is supposed to run it. Originally I was just using the node command and when I opened cmd, navigated to the folder, and typed it manually it worked fine, but when I put that same code into a batch file it gave me this error:

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

This is all the code for that batch file:

@echo off
node bot.js
pause

The node command was in my path so I'm not sure why it wasn't working, but in another post, someone recommended that instead of typing just node to type the full file path, so I tried this and it worked.

Here is the new working code:

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

Then I installed nodemon. Again this works in the cmd when I navigated to the folder and typed it manually, but when I try to do it in the batch file it does not work. Instead of giving me the error it had been before the window just instantly closes. Here is that code:

@echo off
nodemon bot.js
pause

Since I have the pause command at the end of the code it should stop there if I get an error, but it is closing before it gets there for some reason. The nodemon command is in my path and I have also tried replacing nodemon with the file path, C:\Users\tdkni\AppData\Roaming\npm\nodemon.cmd, like I was recommended in the previous post. Neither of these solutions worked, and I think that is because there is some other problem besides the nodemon command not being detected. I don't see any error message since it is closing instantly so I don't know exactly what is wrong.

The registration of the file extensions .bat and .cmd is as follows according to an advice in a comment deleted in the meantime.

Clyte answered 27/8, 2018 at 14:35 Comment(2)
open cmd.exe, then run the script from there, it will show you where the issue is. Do not double click the batch file.Magnus
Yeah that is what I did, I opened cmd, went to the folder, and i typed the name of my batch file and it worked perfectly, but when i double click it it just closes.Clyte
C
1

I'd like to thank all of you for trying to help me with this problem I was having. You have all been very helpful, and while it may not have fixed my problem it did help me understand how all of this works. I just tried to start the bot using the batch file I made and it suddenly worked. I don't know why because I tried to start it the same way I had been the entire time, but as far as I could find, no one else was having this issue anyways so it probably won't matter much that I don't know what fixed it. Again, thank you to everyone that helped me with this.

Clyte answered 29/8, 2018 at 3:53 Comment(0)
R
2

Well, it is pretty clear why node.exe was not found by cmd.exe in directory C:\Program Files\nodejs.

Local Path being system and user Path concatenated contains "C:\Program Files\nodejs;" instead of just C:\Program Files\nodejs.

Folder paths in Path should be never enclosed in double quotes with one exception: The folder path itself contains one or more ;. In this case the folder path with ; must be enclosed in double quotes to get the semicolon(s) in folder path not interpreted as separator between the folder paths. That is general CSV syntax as described on Wikipedia article comma-separated values which is used by Windows for the folder paths in Path with using semicolon as separator.

For that reason cmd.exe searches in a folder with name C:\Program Files\nodejs; for node.* with a file extension listed semicolon separated in environment variable PATHEXT. But there is no folder C:\Program Files\nodejs; because the folder is C:\Program Files\nodejs without the semicolon at end.

And also PATHEXT is defined wrong as it contains at end the folder path C:\Program Files\nodejs although it should contain only file extensions separated by a semicolon.

Other small mistakes:

  1. The first 4 folder paths in system PATH should be always:

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

    Some installers add folder paths at beginning of folder paths list instead of appending them at end as it can be seen here. The Intel64 compiler and the Oracle Java folder paths should be moved in system PATH after PowerShell folder path.

  2. Folder paths can but should not end with a backslash. All backslashes at end of a folder path should be removed from system and user PATH. Microsoft added since Windows Vista the PowerShell path with a trailing backslash for some unknown reason. But it is safe and recommended to nevertheless remove the backslash after WindowsPowerShell\v1.0.

  3. System and user Path (if latter is existing at all) and also PATHEXT should not end with a semicolon. There should be no ; after last folder path respectively last file extension as this means according to CSV specification that there is one more value (folder path, file extension) which is an empty value.

I recommend to define system Path with following value respectively folder paths:

%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\8.1\Windows Performance Toolkit

I recommend to define user Path with following value respectively folder paths:

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

Those two folder paths are user account related and should be added for that reason to user and not system Path.

I recommend to fix system environment variable PATHEXT to:

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

For more details about usage of Path and PATHEXT see the answer on What is the reason for '...' is not recognized as an internal or external command, operable program or batch file? Please take also a look on Wikipedia article about Windows Environment Variables.

Ruche answered 1/9, 2018 at 13:49 Comment(0)
D
2

Here's my answer to the original question, for the benefit of other Windows users (Linux/Mac users not my problem).

In essence, user is trying to run some script.js file with nodemon;

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

, and wants to put in a batch file.

If nodemon is installed globally -g, it installs under

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

So your batch file should be

cd C:\path\to\my\project\
%AppData%\npm\nodemon.cmd bot.js
PAUSE press any key to exit
Divaricate answered 1/1, 2021 at 15:56 Comment(0)
C
1

I'd like to thank all of you for trying to help me with this problem I was having. You have all been very helpful, and while it may not have fixed my problem it did help me understand how all of this works. I just tried to start the bot using the batch file I made and it suddenly worked. I don't know why because I tried to start it the same way I had been the entire time, but as far as I could find, no one else was having this issue anyways so it probably won't matter much that I don't know what fixed it. Again, thank you to everyone that helped me with this.

Clyte answered 29/8, 2018 at 3:53 Comment(0)
M
0

Give this a try for us please, if it works, I will explain:

@echo off
cd /d "C:\Users\tdkni\AppData\Roaming\npm"
echo Testing Script > OUTPUT.log
nodemon.cmd bot.js >> OUTPUT.log
pause
Magnus answered 27/8, 2018 at 15:1 Comment(12)
if you run it from cmd.exe, what is the output? does it show you the pause?Magnus
Well in the bot.js file it is just a loop so it never really gets to the pause unless there is an error. Instead of showing the pause it will just start the bot and I can close the window if I want to stop it. The pause is really only there to show an error if one happens, but it is not showing it. When I try to run it from cmd the bot just starts up as it is supposed to.Clyte
You're doing something wrong. How do you call it in cmd? give me the exact string. also, where exactly is this batch file of yours located?Magnus
I go to the folder using cd\Users\tdkni\OneDrive\Desktop\DiscordBot. Then I use the command "run_nodemon,bat". run_nodemon.bat is the script that contains this: @echo off nodemon bot.js pauseClyte
it is not possible that it does not work if you placed that code in there. If you run it from cmd and it works, then it must work on double click.. Please try the edited code. It should echo to file. double click it, let it run, in the same directory will be a file called OUTPUT.log.. please see the contents of it. and if the file actually exists after double clickMagnus
I tried that and it is still closing immediately, and there is no output file. I really don't understand why I am having this problem or the one in the previous post since as far as I can tell I have done everything correctly.Clyte
Then you are not running the same file. Please take my code. Create a file called. Gerhard.cmd and add the code. Double click gerhard.cmd and get back to.me with the result.Magnus
I made a new file called Gerhard.cmd and it still closed instantly. Could it be that there is a problem with my installation of nodejs and I should try reinstalling it?Clyte
No. Put pause before echo off and double click againMagnus
It did do the pause before echo offClyte
Then check for the output log in "C:\Users\tdkni\AppData\Roaming\npm"Magnus
The output log was in there but all it said was Testing ScriptClyte
D
0

I know this thread is older but I faced the same issue today. If someone like me stumbled across, based on joedotnot's answer, here is what it fixed for me.

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

Where X: is the development folder on the VM Host System mapped as Network Drive in the development Guest System. And config\env.cmd is another batch file which holds some env settings.

My server file is named index.js so there was no need to add is as argument. Nodemon finds the file automatically.

Diaphane answered 27/3, 2022 at 13:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.