PowerShell:启动Firefox,他怎么知道路径?

3 powershell start-process

当我调用以下代码时:

Start-Process Firefox
Run Code Online (Sandbox Code Playgroud)

然后,PowerShell打开浏览器。我可以使用其他几个程序来做到这一点,并且可以正常工作。我的问题是:如果键入Firefox,PowerShell如何知道要打开哪个程序?我的意思是,我没有使用具体的路径或其他内容...

我虽然与环境变量有关……但是我在那里找不到任何名为Firefox的变量……他怎么知道?

Tes*_*ler 5

我找到了一半,但我不能让它们在中间相遇。

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-Processcmdlet具有名为的参数集UseShellExecute。该帮助的“注释”中指出:

通过使用System.Diagnostics.Process类的Start方法来实现此cmdlet。有关此方法的更多信息,请参见Process.StartMethod

尝试在GitHub上跟踪源代码:

是的PowerShell源代码Start-Process

在这里,在此行尝试使用查找$FilePath参数CommandDiscovery.LookupCommandInfo

在这里检查else if (ParameterSetName.Equals("UseShellExecute"))

然后下面就是.Start()这要么是以它的功能ShellExecuteProcess.Start()

好的,不确定ShellExecute和ShellExecuteEx的行为是否相同,但是可能是PS调用Windows,而Windows正在搜索“ FireFox”。

CommandSearcher.LookupCommandInfo说到这里,遵循至TryNormalSearch()其上实现了这里,并立即启动CommandSearcher有一个状态机的东西,它将搜索

  • SearchState.SearchingAliases
  • 功能
  • CmdLets
  • 搜索建筑脚本
  • StartSearchingForExternalCommands
  • PowerShellPathResolution
  • QualifiedFileSystemPath

然后我迷路了。我现在无法继续追踪。

  • 要么直接直接转到Windows进行查找
  • 或PowerShell CommandSearcher以某种方式进行相同的搜索
  • 或者,PowerShell CommandSearcher在某种程度上用尽了搜索功能,整个过程都归结为要求Windows搜索。
    • Process Monitor仅在每个PATH文件夹中记录一个查询“ firefox。*”,然后转到注册表项,这一事实表明它没有这样做,或者我希望有更多查询。
    • 它在每个PATH文件夹中记录了一个查询“ get-firefox。*”的事实,这表明它是PowerShell的命令搜索器在执行查找,而不是Windows。