在Windows上生成和分离“ pwsh.exe”子进程不起作用

问题描述

const { spawn } = require('child_process')
const spawnoptions = { detached: true,stdio: 'ignore' }
const pwshProcess = spawn('pwsh.exe',[
   '-nop','-nol','-c','Set-Content -Path "D:\\outTest.txt" -Value "ok" -NoNewline'
],spawnoptions)

pwshProcess.unref()
process.exit()

文件D:\outTest.txt将不会创建。
如何使代码正常工作?

解决方法

这是我可以在Windows上运行它的唯一方法,但是生成的过程并未分离。我尝试处理pwsh.exe的路径,进程的工作目录以及不同的参数组合。

const { spawn } = require('child_process')

const pwshProcess = spawn('pwsh.exe',[
    '-nop','-nol','-c','Set-Content -Path "./outTest.txt" -Value "ok" -NoNewline -Verbose;'
])

pwshProcess.stdout.on('data',(data) => {
    console.log(data.toString());
});

pwshProcess.stderr.on('data',(data) => {
    console.error(data.toString());
});

pwshProcess.on('exit',(code) => {
    console.log(`Child exited with code ${code}`);
});

// pwshProcess.unref()
// process.exit()

在Linux(Ubuntu)上按预期方式产生一个独立的pwsh进程:

const { spawn } = require
('child_process')
const spawnOptions = { detached: true,stdio: 'ignore' }
const pwshProcess = spawn('pwsh',[ 
    '-nop','Set-Content -Path "outTest.txt" -Value "ok" -NoNewline -Verbose;'
],spawnOptions)
pwshProcess.unref()
process.exit()
,

经过数小时的测试。我发现一种解决方案是使用Windows Shell start命令创建一个新的可分离过程。

const { spawn,exec } = require('child_process')
const startPwshWindow = 'pwsh -nop -nol -noe'
const startPwshHidden = '/b pwsh -nop -nol -c Set-Content -Path ./outTest.txt -Value ok -NoNewline'
// using '/b' switch to create "no" new window

spawn('start',[startPwshWindow],{shell: true}).on('exit',process.exit)
exec(`start ${startPwshWindow}`).on('exit',process.exit)

spawn('start',[startPwshHidden],process.exit)
exec(`start ${startPwshHidden}`).on('exit',process.exit)