- Version:v10.7.0
- Platform:Windows 10 64bit
- Subsystem:child_process
On Windows, child_process.exec (or other methods) supports only cmd.exe as the shell, so running the following shows error messages.
constChildProcess=require("child_process")// trying to use powershell core(pwsh).ChildProcess.exec("echo foo",{shell: "pwsh"},(error,stdout,stderr)=>{if(error){console.error("exec error: ",error);return;}console.log("stdout: ",stdout);console.log("stderr: ",stderr);})result:
exec error: { Error: Command failed: echo foo
The argument '/d' is not recognized as the name of a script file. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
at ChildProcess.exithandler (child_process.js:291:12)
at ChildProcess.emit (events.js:182:13)
at maybeClose (internal/child_process.js:961:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:248:5) killed: false, code: 64, signal: null, cmd: 'echo foo' }
However, there are alternate shells like powershell, git-bash, etc. So I suggest to fix the behavior.
I suppose the cause is this code(a part of child_process.normalizeSpawnArguments):
| if(options.shell){ |
| constcommand=[file].concat(args).join(' '); |
| |
| if(process.platform==='win32'){ |
| if(typeofoptions.shell==='string') |
| file=options.shell; |
| else |
| file=process.env.comspec||'cmd.exe'; |
| args=['/d','/s','/c',`"${command}"`]; |
| options.windowsVerbatimArguments=true; |
| }else{ |
On Windows, it sets /d /s /c for args even if options.shell!=="cmd.exe". Powershell can receive -c option like unix shells, so /d /s /c should be used for only cmd.exe.
On Windows,
child_process.exec(or other methods) supports only cmd.exe as the shell, so running the following shows error messages.result:
However, there are alternate shells like powershell, git-bash, etc. So I suggest to fix the behavior.
I suppose the cause is this code(a part of
child_process.normalizeSpawnArguments):node/lib/child_process.js
Lines 469 to 479 in c3f8dd6
On Windows, it sets
/d /s /cfor args even ifoptions.shell!=="cmd.exe". Powershell can receive-coption like unix shells, so/d /s /cshould be used for only cmd.exe.