3

次のコードを呼び出すと:

Start-Process Firefox

次に、PowerShell がブラウザーを開きます。他のいくつかのプログラムでそれを行うことができ、動作します。私の質問は次のとおりです: Firefox と入力した場合、PowerShell はどのプログラムを開くかをどのように認識しますか? つまり、私は具体的なパスなどを使用していません...

環境変数と関係があると思います...しかし、Firefoxと呼ばれる変数が見つかりません...どうすれば彼は知ることができますか?

4

2 に答える 2

5

半分をなぞったのですが、途中で合わせることができません。

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()ShellExecuteProcess.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 のコマンド サーチャーがルックアップを行っていることを示唆しています。

うーん。

于 2016-11-03T07:58:23.150 に答える
1

Process Monitorを使用して、PowerShell を追跡できました。最初に変数を検索し$env:path、次に変数を検索し$profileます。私の場合、firefox見つからなかったので、レジストリ内をすべて検索して、どういうわけか見つけました。Firefox がシステムにどのようにインストールされているかが関係している可能性があります。

于 2016-11-03T07:20:05.317 に答える