半分をなぞったのですが、途中で合わせることができません。
Process Monitor は、PATH をチェックしていることを示し、最終的にチェックHKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe
するので、インストール場所を見つけて実行する方法に対する私の答えです。
そのレジストリ キーは、次のようなアプリケーション登録用です。
lpFile パラメータに実行可能ファイルの名前を指定して ShellExecuteEx 関数を呼び出すと、関数がファイルを検索する場所がいくつかあります。アプリケーションを App Paths レジストリ サブキーに登録することをお勧めします。
- ファイルは次の場所で検索されます。
- 現在の作業ディレクトリ。
- Windows ディレクトリのみ (サブディレクトリは検索されません)。
- Windows\System32 ディレクトリ。
- PATH 環境変数にリストされているディレクトリー。
- 推奨: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App パス
これは、PowerShell が Windows ShellExecuteEx 関数を呼び出して FireFox を登録済みアプリケーションとして検出するか、同じ種類の内部検索を試みることを意味します。
別の方法で確認してみると、Start-Process
コマンドレットには というパラメーター セットがありますUseShellExecute
。そのヘルプの「メモ」には次のように書かれています。
このコマンドレットは、System.Diagnostics.Process クラスの Start メソッドを使用して実装されます。この方法の詳細については、方法を参照してくださいProcess.Start
。
GitHub のソース コードをトレースしようとしています:
の PowerShell ソース コードは次のとおりですStart-Process
。
ここでは、この行$FilePath
で を使用してパラメーターを検索しようとしますCommandDiscovery.LookupCommandInfo
。
ここでチェックしますelse if (ParameterSetName.Equals("UseShellExecute"))
次に、またはで開始する関数は次のとおりです.Start()
ShellExecute
Process.Start()
OK、ShellExecute と ShellExecuteEx が同じように動作するかどうかはわかりませんが、「FireFox」の検索を行っている Windows を呼び出す PS である可能性があります。
それCommandSearcher.LookupCommandInfo
はここに来て、ここにTryNormalSearch()
実装されているものに続き、検索するもののステートマシンを持つをすぐに開始しますCommandSearcher
- SearchState.SearchingAliases
- 機能
- コマンドレット
- 組み込みスクリプトの検索
- StartSearchingForExternalCommands
- PowerShellPathResolution
- QualifiedFileSystemPath
そこで迷子になります。今はこれ以上フォローできません。
- 検索を行うWindowsに直接ショートカットするか
- または、PowerShell CommandSearcher が何らかの方法で同じ検索を行います
- または、PowerShell CommandSearcher がなんらかの方法で検索を使い果たし、すべてがフォールバックして Windows 検索を要求します。
- Process Monitor が "firefox.*" の各 PATH フォルダーに 1 つのクエリのみをログに記録し、レジストリ キーに移動するという事実は、これが実行されていないことを示唆しています。または、さらに多くのルックアップが予想されます。
- 各 PATH フォルダーに「get-firefox.*」の 1 つのクエリが記録されているという事実は、Windows ではなく、PowerShell のコマンド サーチャーがルックアップを行っていることを示唆しています。
うーん。