从计划的 Windows 任务调用时节点的 spawn/exec 不工作

Node's spawn/exec not working when called from a scheduled Windows task

我遇到了一个非常奇怪的问题,我有一个调用进程的 Node 脚本,它看起来像这样:

  // wslPath declared here (it's a shell file)
  const proc = cp.spawn('ubuntu.exe', ['run', wslPath]);

  let stdout = '';
  proc.stdout.on('data', data => stdout += data.toString());

  let stderr = '';
  proc.stderr.on('data', data => stderr += data.toString());

  return await new Promise((resolve, reject) => {
    proc.on('exit', async code => {
      await fs.remove(winPath);

      if (code) {
        reject({ code, stdout, stderr });
      }

      resolve({ stdout, stderr });
    });
  });

如您所见,脚本调用了 WSL。计算机上启用了 WSL。当我手动 运行 这个脚本时,它工作正常。当我登录到计算机时,脚本正在使用来自另一台计算机的 RDP 并且 运行 它具有相同的凭据,它也可以正常工作。但是当从计划任务调用脚本时, 运行s 具有相同的凭据,spawn 调用 returns:

(node:4684) UnhandledPromiseRejectionWarning: Error: spawn UNKNOWN
    at ChildProcess.spawn (internal/child_process.js:394:11)
    at Object.spawn (child_process.js:540:9)

我通过记录 require('os').userInfo()require('child_process').spawnSync('whoami', { encoding: 'utf8' }) 验证了用户是相同的,并且它 returns 在所有三种情况下都是相同的。

我认为这是因为未找到 ubuntu.exe,但我不知道为什么会这样,因为在所有三种情况下用户都是相同的。

这可能是什么原因,我该如何进一步调试?

Windows 任务计划程序允许您将用户指定为 运行(出于特权原因),但不会为您提供配置的环境(PATH 和其他环境变量)那个用户。

因此,当从 Windows 任务计划程序 运行ning 程序时,重要的是不要对环境中的内容(尤其是 PATH)做出任何假设。如果我的程序依赖于环境中的某些东西,我有时会将我的任务更改为 .BAT 文件,该文件首先根据需要设置环境,然后从那里启动我的程序。

除其他事项外,不依赖路径的最简单方法是指定您正在 运行ning 的可执行文件的完整路径,而不是假设它会在路径中的某处找到。但是,您还需要确保您的可执行文件可以在没有任何环境变量的情况下找到它可能需要的任何其他资源,或者您需要在 运行ning.

之前为其配置这些环境变量。