Closed
Description
- 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.
const ChildProcess = 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
):
Lines 469 to 479 in c3f8dd6
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.