我们可以通过Process
开启一个进程,但是如果通过这个进程再开启另一个进程时,就容易发生错误。
##上Demo
1、我们在vscode的目录下,建立一个名为2.bat
的脚本,里面输入命令Code.exe
打开vscode
2、然后,我们在同一个目录下打开PowerShell
,输入Start-Process .\2.bat
通过Process
的方式运行这个脚本。
我们发现运行一切正常
那么如果添加RunAs
3、我们现在使用Start-Process .\2.bat -Verb runas
使用管理员方式运行脚本。
我们发现运行不了了。
4、为了确认发现了什么事情,我们在脚本中添加Pause
重新以RunAs
方式执行后发现,运行路径竟然是C:WINDOWS\System32
那么自然找不到Code.exe
咯
所以这是一个相对路径的问题。
其他的坑
发现是路径问题后,我们会想那么在打开非当前所在路径的进程时会不会有同样问题呢?
5、我们将PowerShell
的当前路径移动到上级目录,然后运行2.bat
可以看到2.bat
执行路径仍为PowerShell
的当前路径。
同样无法开启Code.exe
结论
##原因
Process
以RunAs
方式启动进程,执行目录在系统目录,一般为C:WINDOWS\System32
。Process
以普通方式启动进程,执行目录在当前运行目录,而不在目标进程所在目录。
解决方式
既然知道了问题所在,那么解决方案就很简单了。
-
将启动的工作目录调整到目标进程的工作目录,以非
RunAs
方式启动这种方式可以解决
PowerShell
的问题,但是如果是在C#中使用,或者必须要求目标进程以管理员权限启动时就很尴尬了。 -
不要使用相对路径
正解,没问题,杠杠的
-
设置
WorkingDirectory
如果你使用的是第三方软件,而第三方软件已经使用了相对路径。这个几乎就是唯一方案了
这样讲执行目录强制设置为目标进程所在目录,就不会出现相对路径找不到的问题了
本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/Process%E6%89%A7%E8%A1%8C%E8%B7%AF%E5%BE%84.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。