当我调用以下代码时:
Start-Process Firefox
Run Code Online (Sandbox Code Playgroud)
然后,PowerShell打开浏览器。我可以使用其他几个程序来做到这一点,并且可以正常工作。我的问题是:如果键入Firefox,PowerShell如何知道要打开哪个程序?我的意思是,我没有使用具体的路径或其他内容...
我虽然与环境变量有关……但是我在那里找不到任何名为Firefox的变量……他怎么知道?
我找到了一半,但我不能让它们在中间相遇。
Process Monitor显示它检查PATH,并最终检查HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe
,这就是我对如何找到安装位置然后运行它的答案。
该注册表项用于应用程序注册,其中说:
当在lpFile参数中使用可执行文件的名称调用ShellExecuteEx函数时,该函数会在多个位置查找文件。我们建议您在“应用程序路径”注册表子项中注册您的应用程序。
- 在以下位置搜索文件:
- 当前的工作目录。
- 仅Windows目录(不搜索子目录)。
- Windows \ System32目录。
- PATH环境变量中列出的目录。
- 推荐:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App路径
这意味着PowerShell调用Windows ShellExecuteEx函数,该函数将FireFox查找为已注册的应用程序,或者在内部尝试进行相同类型的搜索。
换一种方式尝试确认,该Start-Process
cmdlet具有名为的参数集UseShellExecute
。该帮助的“注释”中指出:
通过使用System.Diagnostics.Process类的Start方法来实现此cmdlet。有关此方法的更多信息,请参见
Process.Start
Method
尝试在GitHub上跟踪源代码:
这是的PowerShell源代码Start-Process
。
在这里,它在此行尝试使用查找$FilePath
参数CommandDiscovery.LookupCommandInfo
。
在这里检查else if (ParameterSetName.Equals("UseShellExecute"))
然后下面就是.Start()
这要么是以它的功能ShellExecute
或Process.Start()
好的,不确定ShellExecute和ShellExecuteEx的行为是否相同,但是可能是PS调用Windows,而Windows正在搜索“ FireFox”。
那CommandSearcher.LookupCommandInfo
说到这里,遵循至TryNormalSearch()
其上实现了这里,并立即启动CommandSearcher
它有一个状态机的东西,它将搜索
然后我迷路了。我现在无法继续追踪。
嗯
归档时间: |
|
查看次数: |
1067 次 |
最近记录: |