我正试图从WSL Ubuntu 20.04中运行的Node.js脚本打开explorer.exe
。我遇到的问题是explorer.exe
从不打开我想要的文件夹。它打开的不是WSL用户的主目录,而是Windows用户的Documents
文件夹。我应该怎么做才能使explorer.exe
打开我想要的文件夹?
以下是我尝试过的:
该脚本首先定义了一个函数execShellCommand
,该函数承诺exec
。然后,自执行函数首先将process.env.HOME
转换为具有wslpath
的Windows路径。然后以转换后的路径作为参数执行CCD_ 9。
#!/usr/bin/node
const execShellCommand = async cmd => {
const exec = require('child_process').exec
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
if (error) {
console.warn(error)
}
resolve(stderr ? stderr : stdout)
})
})
}
;(async () => {
const path = await execShellCommand(`wslpath -w "${process.env.HOME}"`)
console.log({ path })
await execShellCommand(`explorer.exe ${path}`)
})()
当我在WSL 中运行脚本时得到的输出
$ ./script.js
{ path: '\\wsl$\Ubuntu-20.04\home\usern' }
Error: Command failed: explorer.exe \wsl$Ubuntu-20.04homeuser
at ChildProcess.exithandler (child_process.js:308:12)
at ChildProcess.emit (events.js:315:20)
at maybeClose (internal/child_process.js:1048:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5) {
killed: false,
code: 1,
signal: null,
cmd: 'explorer.exe \\wsl$\Ubuntu-20.04\home\usern'
}
不管输出中显示的错误如何,explorer.exe
都会运行。奇怪的是,如果我运行相同的命令,我的脚本会尝试直接在WSL终端中运行(explorer.exe \\wsl$\Ubuntu-20.04\home\usern
(。explorer.exe
确实打开了我想要的文件夹。修剪路径末尾的新行没有帮助。
我认为您必须对wslpath
生成的反斜杠进行一些额外的转义。下面的代码适用于我,这意味着它会在Windows资源管理器中打开正确的目录。
注意:它仍然会抛出您提到的错误,我认为这是由于节点退出的方式,而不是执行explorer.exe
时出现的任何错误;无论如何,我都不是节点专家
#!/usr/bin/node
const execShellCommand = async cmd => {
const exec = require('child_process').exec
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
if (error) {
console.warn(error)
}
resolve(stderr ? stderr : stdout)
})
})
}
;(async () => {
let path = await execShellCommand(`wslpath -w "${process.env.HOME}"`)
console.log("before", {path});
path = path.replace(/\/g,"\\");
console.log("after", {path});
await execShellCommand(`explorer.exe ${path}`)
})()
甚至比替换反斜杠更干净,我认为这将通过将$HOME
变量直接解析到命令行中来为您工作:
await execShellCommand(`explorer.exe "$(wslpath -w $HOME)"`);