首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >explorer.exe在WSL中以编程方式运行时不会打开正确的文件夹

explorer.exe在WSL中以编程方式运行时不会打开正确的文件夹
EN

Stack Overflow用户
提问于 2020-11-21 23:51:55
回答 1查看 207关注 0票数 2

我试图从运行在WSLUbuntu20.04中的一个explorer.exe脚本中打开Node.js。我遇到的问题是,explorer.exe从未打开我希望它打开的文件夹。它不是WSL用户的主目录,而是打开我的Windows的Documents文件夹。如何让explorer.exe打开我想要的文件夹?

以下是我尝试过的:

该脚本首先定义了一个函数execShellCommand,该函数可以促进exec。然后,自动执行函数首先将process.env.HOME转换为带有wslpath的Windows路径.然后,它以转换的路径作为参数执行explorer.exe

代码语言:javascript
复制
#!/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中运行脚本时得到的输出

代码语言:javascript
复制
$ ./script.js 
{ path: '\\\\wsl$\\Ubuntu-20.04\\home\\user\n' }
Error: Command failed: explorer.exe \\wsl$\Ubuntu-20.04\home\user


    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\\user\n'
}

无论输出中显示的错误如何,explorer.exe都会运行。奇怪的是,如果我运行相同的命令,我的脚本就会在WSL终端直接运行(explorer.exe \\\\wsl$\\Ubuntu-20.04\\home\\user\n),explorer.exe会打开我想要它的文件夹。修整路径末尾的新行没有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-22 00:30:37

我认为您必须对wslpath生成的反斜杠进行额外的转义。下面的代码适用于我,意思是在Windows 中打开正确的目录。

注意:它仍然会抛出您提到的错误,我认为这是由于节点的退出方式,而不是执行explorer.exe__的任何错误;无论如何,我不是节点专家。

代码语言:javascript
复制
#!/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变量直接解析到命令行来对您有效:

代码语言:javascript
复制
await execShellCommand(`explorer.exe "$(wslpath -w $HOME)"`);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64949351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档