当我拨打以下代码时:
Start-Process Firefox
然后PowerShell打开浏览器。我可以用其他几个程序来做到这一点并且有效。我的问题是:如果我键入Firefox,PowerShell如何知道打开哪个程序?我的意思是,我没有使用具体的路径或其他东西......
我虽然它与环境变量有关...但是我找不到任何名为Firefox的变量......他怎么知道?
答案 0 :(得分:4)
我追踪了它的两半,但我不能让它们在中间相遇。
进程监视器显示它检查PATH,并最终检查HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe
,这是我找到安装位置的答案,然后运行它。
该注册表项为for Application Registration,其中包含:
当在其lpFile参数中使用可执行文件的名称调用ShellExecuteEx函数时,该函数会在几个地方查找该文件。我们建议您在App Paths注册表子项中注册您的应用程序。
- 该文件在以下位置寻找:
- 当前工作目录。
- 仅限Windows目录(不搜索子目录)。
- Windows \ System32目录。
- PATH环境变量中列出的目录。
- 推荐:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths
这意味着PowerShell调用Windows ShellExecuteEx函数,该函数将FireFox作为已注册的应用程序查找,或者在内部尝试相同类型的搜索。
另一种方法是尝试确认,Start-Process
cmdlet有一个名为UseShellExecute
的参数集。该帮助的“注释”说:
此cmdlet是使用System.Diagnostics.Process类的Start方法实现的。有关此方法的详细信息,请参阅
Process.Start
方法
尝试在GitHub上追溯源代码:
Here是Start-Process
的PowerShell源代码。
Here, at this line它尝试使用$FilePath
查找CommandDiscovery.LookupCommandInfo
参数。
Here它检查else if (ParameterSetName.Equals("UseShellExecute"))
然后Here是.Start()
函数,可以使用ShellExecute
或Process.Start()
好的,不确定ShellExecute和ShellExecuteEx是否表现相同,但它可能是PS调用Windows,正在搜索“FireFox”。
CommandSearcher.LookupCommandInfo
comes in here并TryNormalSearch()
跟随here实施has a state machine for the things it will search并立即开始CommandSearcher
{{3}}
然后我迷路了。我现在不能再进一步了。
嗯。
答案 1 :(得分:0)
使用Process Monitor我能够跟踪PowerShell。
它首先搜索$env:path
变量,然后搜索$profile
变量。
在我的情况下,firefox
未找到,然后它在注册表中搜索了很多,并以某种方式找到它。
它可能与firefox在系统上的安装方式有关。