PowerShell:Start-Process Firefox,他如何知道路径?

时间:2016-11-03 05:53:01

标签: powershell start-process

当我拨打以下代码时:

Start-Process Firefox

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

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

2 个答案:

答案 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上追溯源代码:

HereStart-Process的PowerShell源代码。

Here, at this line它尝试使用$FilePath查找CommandDiscovery.LookupCommandInfo参数。

Here它检查else if (ParameterSetName.Equals("UseShellExecute"))

然后Here.Start()函数,可以使用ShellExecuteProcess.Start()

启动它

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

CommandSearcher.LookupCommandInfo comes in hereTryNormalSearch()跟随here实施has a state machine for the things it will search并立即开始CommandSearcher {{3}}

  • SearchState.SearchingAliases
  • 功能
  • 小命令
  • SearchingBuiltinScripts
  • StartSearchingForExternalCommands
  • PowerShellPathResolution
  • QualifiedFileSystemPath

然后我迷路了。我现在不能再进一步了。

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

嗯。

答案 1 :(得分:0)

使用Process Monitor我能够跟踪PowerShell。 它首先搜索$env:path变量,然后搜索$profile变量。 在我的情况下,firefox未找到,然后它在注册表中搜索了很多,并以某种方式找到它。 它可能与firefox在系统上的安装方式有关。