web-dev-qa-db-ja.com

Windowsコマンドプロンプトは、アプリケーションプログラムの起動時に、PATH変数で指定された場所以外の場所を検索しますか?

私は以下の実験を試みました。

始める前に、cmdからPATH変数をチェックしました。この変数の値は次のとおりです。

Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;

最初、cmdはPATH変数に含まれているディレクトリ内の実行可能ファイルのみを検索すると考えたので、ランダムにアプリケーション - winword.exe(Microsoft Word)を選び、コマンドラインから起動しようとしました。

start winword

しかし、驚いたことに、プログラムは開始されました。私が驚いた理由は、 'winword'というexeファイルをPATH変数内のすべてのディレクトリで検索しましたが、すべての検索が空になったためです。

したがって、実行可能ファイルを探すには、コマンドPromptがPATH変数で指定された場所以外の場所を検索することがわかっている必要があると結論付けました。

だから、明らかに、私がした次のことは 'winword'実行ファイルがある正確な場所を探すことでした。 winword.exeは次の場所にあることがわかりました。

C:\Program Files\Microsoft Office 15\root\office15

そのため、 'start'コマンドを実行すると、CMDはProgramFilesおよびProgramFiles(x86)(およびそれらのすべてのサブディレクトリ)を自動的に調べます。これにより、私のコンピュータにインストールされている別のアプリケーション、Audacityをexeファイルで起動しようとしました。

C:\Program Files (x86)\Audacity

繰り返しになりますが、驚いたことに、Audacityは次のように入力しても起動できませんでした。

start audacity

コマンドラインで。

enter image description here

私はそれからPATHにaudacity.exeを含むディレクトリを追加しました:

set path=%path%;C:\Program Files (x86)\Audacity

その後、私は再びaudacityを立ち上げました:

start audacity

もちろん、Audacityが発表されました。

私が知りたいのは、コマンドプロンプトが実行可能ファイルを正確に探す場所です。 winword.exeが含まれているディレクトリがPATHの一部ではない場合でもwinword.exeが起動するのはなぜですか?しかし、同じことがaudacity.exeにも当てはまりません。

他のアプリケーションも試しました。 startコマンドを使用すると、ChromeとFirefoxが動作します。

アップデート:Windowsバージョン6.3.9600(Windows 8.1)を実行しています。

35
Anthony

最初、cmdはPATH変数に含まれるディレクトリ内の実行ファイルのみを検索すると考えたので、ランダムにアプリケーションwinword.exe(Microsoft Word)を選び、コマンドラインから起動しようとしました。

winword.exeが機能した理由は、Microsoft Word(Winword.exe)へのパスを定義するレジストリキーが存在するためです。これらのアプリケーションがインストールされている場合は、Firefox.exeとChrome.exeにも同様のキーが存在します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App PathsHKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

私が知りたいのは、コマンドプロンプトが実行可能ファイルを正確に探す場所です。

システムパス変数、ユーザーパス変数、および..\App Paths内のさまざまなキー。私はAudacityがインストールされたときにそれ自身のためにキーを作成しないことを確認することができました。

ShellExecuteEx関数がlpFileパラメーターで実行可能ファイルの名前で呼び出されると、関数がファイルを探す場所がいくつかあります。アプリケーションをApp Pathsレジストリサブキーに登録することをお勧めします。そうすることで、アプリケーションがシステムのPATH環境変数を変更する必要がなくなります。

  • 現在の作業ディレクトリ.
  • Windowsディレクトリのみ(サブディレクトリは検索されません)。
  • Windows\System32ディレクトリ。
  • PATH環境変数にリストされているディレクトリ。
  • 推奨:HKEY_LOCAL_MACHINE \ソフトウェア\ Microsoft\Windows\CurrentVersion \アプリケーションのパス

出典: 申請登録

44
Ramhound

コマンドプロンプトから、単にWinWordと入力すると実行に失敗します。

START WinWordと入力すると実行されます。

ここでStartコマンドが重要です。

Startコマンドを使用してファイルを実行しようとすると、コマンドプロンプトは検索を実行しません。その代わりに、ファイル名(および引数)をWindows自身に渡し(ShellExecuteEx API呼び出しを介して)、そこでファイルの場所を探す必要があります。次の順序で検索する場所がいくつかあります。

  • 現在の作業ディレクトリ.

  • Windowsディレクトリのみ(サブディレクトリは検索されません)。

  • Windows\System32ディレクトリ。

  • PATH環境変数にリストされているディレクトリ。

  • おすすめ:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordはそのレジストリキーにあります。重要なのは、PATHが長くなり過ぎないようにすることです。

15
Larryc

Windowsコマンドプロセッサ(CMD.EXE)でプログラム(コマンドプロンプトでdrive/pathなしでモジュール名を指定した場合)は、見つかると起動します。

  • pATH環境変数(実行可能ファイルとその同じハードリンク/ソフトリンク/ショートカットの両方)

  • dOSKEY別名で

  • HKLM\Software\Microsoft\Windows\CurrentVersion\App PathsまたはHKCU\Software\Microsoft\Windows\CurrentVersion\App Pathsからのアプリケーションパスによる(startコマンド使用時)

この知識(特に最後のもの)を使用して、あなたにとって便利なあなた自身のエイリアスを作成することができます。たとえば、デフォルト値のC:\Program Files (x86)\Audacity\Audacity.exeHKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exeを作成し、コマンドプロンプトでstart auと入力するだけでこのアプリケーションを起動できます。

6
Akina

start winwordは、コマンドプロンプトにwinwordを起動するように指示しません。引数startを付けてwinwordを起動するようにPromptコマンドに指示します。 Startは独自のメソッドを使用してwinwordを見つけます。

winwordだけで、コマンドプロンプトにwinwordを起動するよう指示します。 winwordPATH上にないので、それを試しても起動しません。

0
Eric Towers

他の答えがあなたのケースの具体的な理由である可能性が高いが、他のいくつかのアプリケーションの場合はその可能性があるかもしれないあなたの質問に対する別の答えもありますが、ファイル拡張子が異なります。

あなたは具体的にあなたが拡張子exeを持つファイルを探していたと言った。 Windowsは他の拡張子のファイルも実行しようとします。

コマンドを実行するときに有効になるもう1つの環境変数は、変数PATHEXTです。これは、実行を試みるファイル拡張子の;で区切られたリストです。 PATHEXTをエコーすると、.COM;.EXE;.BAT;.CMD;.VBS;...(など)のように見えるかもしれません。一部のアプリケーションは、これらの他の種類のファイルをエンドユーザーのエントリポイントとして使用します。それほど一般的ではありませんが、起こります。私は.BATスクリプトから始まるいくつかの主要な商用製品を使用しました。例としてそれらのうちの1つを使用するために、standalone.exe...がなくても、standaloneというコマンドで始めることができます。代わりにstandalone.batがあります。

私が今見ているPATHEXTの拡張機能の中には、アプリケーションを使ったことがない人もいます。私が持っているものはもっと一般的に(しかし明らかにexeほどではありません)、:.com.bat.vbs.js.jarです。最初の2つはwindowsバッチスクリプトファイルで、他の3つはexesからではなくスクリプトまたは仮想マシンからそれぞれ実行される特定のプログラミング言語用のファイルタイプです(それぞれVisual Basic、Javascript、およびJava)。

0
Loduwijk