Apakah Windows Command Prompt mencari di tempat lain selain dari lokasi yang ditentukan oleh variabel PATH saat meluncurkan program aplikasi?

35

Saya mencoba percobaan berikut.

Sebelum saya mulai, saya memeriksa variabel PATH dari cmd, yang memiliki nilai berikut:

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\;

Pada awalnya, saya berpikir bahwa cmd hanya mencari executable di direktori yang terdapat dalam variabel PATH, jadi saya secara acak memilih aplikasi - winword.exe (Microsoft Word), dan mencoba meluncurkannya dari baris perintah:

start winword

Tapi yang mengejutkan saya, program ini diluncurkan! Alasan saya terkejut adalah karena saya telah mencari di seluruh direktori dalam variabel PATH untuk file exe yang disebut 'winword' tetapi semua pencarian saya kosong!

Karena itu saya telah menyimpulkan bahwa command prompt pasti tahu untuk mencari di tempat selain yang ditentukan dalam variabel PATH untuk mencari executable.

Jadi jelas, hal berikutnya yang saya lakukan adalah mencari lokasi yang tepat di mana file executable 'winword' berada. Ternyata winword.exe terletak di sini:

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

Maka memberi saya ide bahwa mungkin CMD secara otomatis melihat melalui ProgramFiles dan ProgramFiles (x86) (dan semua subdirektori mereka) ketika menjalankan perintah 'mulai'? Yang membuat saya mencoba meluncurkan aplikasi lain yang terinstal di komputer saya, Audacity, dengan file exe yang terletak di:

C:\Program Files (x86)\Audacity

Sekali lagi, yang mengejutkan saya, Audacity gagal diluncurkan ketika saya mengetik:

start audacity

di baris perintah.

masukkan deskripsi gambar di sini

Saya kemudian menambahkan direktori yang berisi audacity.exe ke PATH:

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

setelah itu saya mencoba meluncurkan lagi keberanian:

start audacity

Yah, tidak mengherankan, Audacity diluncurkan.

Yang ingin saya ketahui adalah di mana tepatnya command prompt mencari executable? Mengapa winword.exe diluncurkan bahkan ketika direktori yang berisi itu bukan bagian dari PATH, tetapi hal yang sama tidak berlaku untuk audacity.exe?

Saya mencoba aplikasi lain juga. Chrome dan Firefox berfungsi saat saya menggunakan perintah mulai.

UPDATE: Saya menjalankan Windows versi 6.3.9600 (Windows 8.1)

Anthony
sumber

Jawaban:

44

Pada awalnya, saya berpikir bahwa cmd hanya mencari executable di direktori yang terdapat dalam variabel PATH, jadi saya secara acak memilih aplikasi - winword.exe (Microsoft Word) dan mencoba meluncurkannya dari baris perintah:

Alasannya winword.exeadalah karena ada kunci registri yang menentukan jalur ke Microsoft Word (Winword.exe). Kunci serupa ada untuk Firefox.exe dan Chrome.exe jika aplikasi tersebut diinstal.

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

Yang ingin saya ketahui adalah di mana tepatnya command prompt mencari executable?

Variabel PATH Sistem, Variabel PATH Pengguna, dan berbagai tombol di dalamnya ..\App Paths. Saya dapat mengonfirmasi bahwa Audacity tidak membuat kunci untuk dirinya sendiri ketika diinstal.

Ketika fungsi ShellExecuteEx dipanggil dengan nama file yang dapat dieksekusi di parameter lpFile, ada beberapa tempat di mana fungsi mencari file. Kami menyarankan untuk mendaftarkan aplikasi Anda di subkunci registri App Paths. Melakukan hal itu menghindari perlunya aplikasi untuk memodifikasi variabel lingkungan PATH sistem.

  • Direktori kerja saat ini.
  • Hanya direktori Windows (tidak ada subdirektori yang dicari).
  • Direktori Windows \ System32.
  • Direktori yang tercantum dalam variabel lingkungan PATH.
  • Dianjurkan: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths

Sumber: Pendaftaran Aplikasi

Ramhound
sumber
15

Dari command prompt, jika Anda memasukkannya WinWordgagal dijalankan.

Jika Anda memasukkannya START WinWordberjalan.

The Startperintah adalah kunci di sini.

Saat Anda mencoba menjalankan file melalui perintah mulai, Prompt Perintah tidak melakukan pencarian apa pun. Sebagai gantinya, ia meneruskan nama file (dan argumen) ke Windows sendiri (melalui panggilan API ShellExecuteEx), yang kemudian harus mencari lokasi file. Ada beberapa tempat yang dicari dalam urutan berikut:

  • Direktori kerja saat ini.

  • Hanya Windowsdirektori (tidak ada subdirektori yang dicari).

  • The Windows\System32direktori.

  • Direktori yang tercantum dalam PATHvariabel lingkungan.

  • Direkomendasikan:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordada di kunci registri itu. Kuncinya ada di sana agar PATHtidak terlalu lama.

Larryc
sumber
7
Silakan kutip dan kutip semua sumber. Kecuali Anda menulis urutan pencarian dari memori, Anda seharusnya mengutip sumber Anda, yang menunjukkan daftar dan urutan yang dicari.
Ramhound
Sumbernya adalah catatan saya dari sesuatu yang saya kerjakan beberapa tahun yang lalu. Saya tidak tahu di mana saya mengambilnya saat itu, halaman web datang dan pergi.
Larryc
5
Anda mendapatkannya dari dokumentasi yang sama dengan orang lain.
Ramhound
7

Program (ketika Anda menentukan nama modulnya tanpa drive / path di command prompt) di prosesor perintah Windows (CMD.EXE) dapat dimulai ketika ditemukan:

  • oleh variabel lingkungan PATH (keduanya dapat dieksekusi dan hardlink / softlink / pintasnya dengan nama yang sama)

  • oleh DOSKEY alias

  • menurut jalur aplikasi dari HKLM\Software\Microsoft\Windows\CurrentVersion\App Pathsatau HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths(saat menggunakan startperintah)

Menggunakan pengetahuan ini (terutama yang terakhir), Anda dapat membuat alias sendiri yang nyaman bagi Anda. Misalnya Anda dapat membuat HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exedengan nilai default C:\Program Files (x86)\Audacity\Audacity.exedan memulai aplikasi ini hanya dengan mengetikkan start aucommand prompt.

Akina
sumber
0

Sementara jawaban lain kemungkinan menjadi alasan spesifik dalam kasus Anda, ada juga jawaban lain untuk pertanyaan Anda yang mungkin menjadi kasus untuk beberapa aplikasi lain: di tempat yang sama dengan yang Anda cari, tetapi dengan ekstensi file yang berbeda.

Anda secara khusus mengatakan bahwa Anda sedang mencari file dengan ekstensi exe. Windows juga akan berusaha untuk mengeksekusi file dari ekstensi lain.

Variabel lingkungan lain yang ikut bermain saat mengeksekusi perintah adalah variabel PATHEXT. Ini adalah ;daftar ekstensi file yang akan dieksekusi untuk mencoba dieksekusi. Jika Anda menggema, PATHEXTAnda mungkin melihat sesuatu seperti .COM;.EXE;.BAT;.CMD;.VBS;... (dll.). Beberapa aplikasi menggunakan tipe file lain ini sebagai titik masuk pengguna akhir. Ini jauh lebih jarang, tetapi itu terjadi. Saya telah menggunakan beberapa produk komersial utama yang dimulai dari .BATskrip. Untuk menggunakan salah satu dari mereka sebagai contoh, saya dapat memulainya dengan perintah standalonemeskipun tidak ada standalone.exe... sebagai gantinya, ia memiliki a standalone.bat.

Beberapa ekstensi yang saya miliki di PATHEXTSaya sedang melihat saat ini saya belum pernah menggunakan aplikasi. Orang yang saya telah mengalami jauh lebih umum (tapi jelas tidak sebanyak exe) adalah: .com, .bat, .vbs, .js, .jar. Dua yang pertama adalah file skrip batch windows, dan tiga lainnya adalah tipe file untuk bahasa pemrograman tertentu yang dijalankan dari skrip atau mesin virtual, bukan dari exes (masing-masing: visual basic, javascript, dan java).

Loduwijk
sumber
Kepedulian pemilih yang rendah untuk berkomentar (saya tahu biasanya tidak ada gunanya bertanya, tetapi kadang-kadang saya mendapat jawaban)? Apakah saya melakukan kesalahan di suatu tempat?
Loduwijk
Bukan saya, tetapi pada tebakan liar itu karena sementara PATHEXTdan PATH, keduanya terkait untuk menjalankan sesuatu, mereka agak ortogonal dalam tugas masing-masing. PATHmenentukan tempat untuk mencari hal-hal untuk dijalankan, dan apa yang diminta OP, sementara PATHEXTmenentukan apa yang bisa dijalankan.
dgnuff
@ Dgnuff Menarik, karena itu yang saya maksud: OP secara khusus mengatakan pertanyaan dengan cara yang memohon untuk tantangan bingkai ... dalam istilah SE, mereka mengajukan "pertanyaan XY" dengan membuat asumsi bahwa file yang sedang dijalankan tidak di tempat-tempat yang sudah dicari di jalan. Bagaimanapun, terima kasih.
Loduwijk
0

start winwordtidak memberi tahu command prompt untuk memulai winword. Ini memberitahu command prompt untuk memulai startdengan argumen winword. Startmenggunakan metode sendiri untuk menemukan winword.

Hanya winwordmemberi tahu command prompt untuk memulai winword. Dan jika Anda mencobanya, karena winwordtidak aktif PATH, itu tidak diluncurkan.

Eric Towers
sumber