Skip to content

我们可以通过Process开启一个进程,但是如果通过这个进程再开启另一个进程时,就容易发生错误。

##上Demo

1、我们在vscode的目录下,建立一个名为2.bat的脚本,里面输入命令Code.exe打开vscode

1535000695469

2、然后,我们在同一个目录下打开PowerShell ,输入Start-Process .\2.bat通过Process的方式运行这个脚本。

1535000909053

我们发现运行一切正常

那么如果添加RunAs

3、我们现在使用Start-Process .\2.bat -Verb runas 使用管理员方式运行脚本。

1535005038430

我们发现运行不了了。

4、为了确认发现了什么事情,我们在脚本中添加Pause

1535005208982

1535005179252

重新以RunAs方式执行后发现,运行路径竟然是C:WINDOWS\System32

那么自然找不到Code.exe

所以这是一个相对路径的问题。

其他的坑

发现是路径问题后,我们会想那么在打开非当前所在路径的进程时会不会有同样问题呢?

5、我们将PowerShell的当前路径移动到上级目录,然后运行2.bat

1535005642079

1535005725102

可以看到2.bat执行路径仍为PowerShell的当前路径。

同样无法开启Code.exe

结论

##原因

  • ProcessRunAs方式启动进程,执行目录在系统目录,一般为 C:WINDOWS\System32
  • Process以普通方式启动进程,执行目录在当前运行目录,而不在目标进程所在目录。

解决方式

既然知道了问题所在,那么解决方案就很简单了。

  • 将启动的工作目录调整到目标进程的工作目录,以非RunAs方式启动

    这种方式可以解决PowerShell的问题,但是如果是在C#中使用,或者必须要求目标进程以管理员权限启动时就很尴尬了。

  • 不要使用相对路径

    正解,没问题,杠杠的

  • 设置WorkingDirectory

    如果你使用的是第三方软件,而第三方软件已经使用了相对路径。这个几乎就是唯一方案了

    1535006579040

    1535006647302

    这样讲执行目录强制设置为目标进程所在目录,就不会出现相对路径找不到的问题了

最后更新于:

基于 VitePress + @sugarat/theme 构建