我们可以通过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

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


本文会经常更新,请阅读原文: https://huangtengxiao.gitee.io/post/Process%E6%89%A7%E8%A1%8C%E8%B7%AF%E5%BE%84.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://huangtengxiao.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系