Windows Command Prompt có tìm kiếm ở đâu đó ngoài các vị trí được chỉ định bởi biến PATH khi khởi chạy các chương trình ứng dụng không?


35

Tôi đã thử thí nghiệm sau.

Trước khi bắt đầu, tôi đã kiểm tra biến PATH từ cmd, có giá trị sau:

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

Lúc đầu, tôi nghĩ rằng cmd chỉ tìm kiếm các tệp thực thi trong các thư mục chứa trong biến PATH, vì vậy tôi đã chọn ngẫu nhiên một ứng dụng - winword.exe (Microsoft Word) và cố gắng khởi chạy nó từ dòng lệnh:

start winword

Nhưng thật ngạc nhiên, chương trình ra mắt! Lý do tôi ngạc nhiên là vì tôi đã tìm kiếm trong tất cả các thư mục trong biến PATH cho tệp exe có tên là 'winword' nhưng tất cả các tìm kiếm của tôi đều trống rỗng!

Do đó, tôi đã kết luận rằng dấu nhắc lệnh phải biết tìm kiếm ở những nơi khác ngoài những nơi được chỉ định trong biến PATH để tìm kiếm các tệp thực thi.

Vì vậy, rõ ràng, điều tiếp theo tôi đã làm là tìm kiếm vị trí chính xác nơi đặt tệp thực thi 'winword'. Hóa ra winword.exe được đặt ở đây:

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

Do đó, cho tôi ý tưởng rằng có lẽ CMD tự động xem qua ProgramFiles và ProgramFiles (x86) (và tất cả các thư mục con của chúng) khi thực hiện lệnh 'start'? Điều đó dẫn đến việc tôi cố gắng khởi chạy một ứng dụng khác được cài đặt trên máy tính của mình, Audacity, với tệp exe có tại:

C:\Program Files (x86)\Audacity

Một lần nữa, thật ngạc nhiên, Audacity đã không khởi chạy khi tôi gõ:

start audacity

tại dòng lệnh.

nhập mô tả hình ảnh ở đây

Sau đó tôi đã thêm thư mục chứa audacity.exe vào PATH:

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

sau đó tôi đã thử khởi động lại audacity:

start audacity

Chà, không ngạc nhiên, Audacity đã ra mắt.

Những gì tôi muốn biết là chính xác nơi dấu nhắc lệnh tìm kiếm thực thi? Tại sao winword.exe khởi chạy ngay cả khi thư mục chứa nó không phải là một phần của PATH, nhưng điều tương tự không đúng với audacity.exe?

Tôi cũng đã thử các ứng dụng khác. Chrome và Firefox hoạt động khi tôi sử dụng lệnh start.

CẬP NHẬT: Tôi đang chạy phiên bản Windows 6.3.9600 (Windows 8.1)


Câu trả lời:


44

Lúc đầu, tôi nghĩ rằng cmd chỉ tìm kiếm các tệp thực thi trong các thư mục chứa trong biến PATH, vì vậy tôi đã chọn ngẫu nhiên một ứng dụng - winword.exe (Microsoft Word) và cố gắng khởi chạy nó từ dòng lệnh:

Lý do winword.exelàm việc là vì một khóa registry tồn tại đã xác định đường dẫn đến Microsoft Word (Winword.exe). Một khóa tương tự tồn tại cho Firefox.exe và Chrome.exe nếu các ứng dụng đó được cài đặt.

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

Những gì tôi muốn biết là chính xác nơi dấu nhắc lệnh tìm kiếm thực thi?

Biến hệ thống PATH, biến PATH của người dùng và các khóa khác nhau bên trong ..\App Paths. Tôi đã có thể xác nhận rằng Audacity không tự tạo khóa khi cài đặt.

Khi hàm ShellExecuteEx được gọi với tên của một tệp thực thi trong tham số lpFile của nó, có một số vị trí mà hàm tìm kiếm tệp. Chúng tôi khuyên bạn nên đăng ký ứng dụng của mình trong khoá con đăng ký Đường dẫn ứng dụng. Làm như vậy để tránh sự cần thiết của các ứng dụng để sửa đổi biến môi trường PATH của hệ thống.

  • Các thư mục làm việc hiện tại.
  • Chỉ thư mục Windows (không có thư mục con nào được tìm kiếm).
  • Thư mục Windows \ System32.
  • Các thư mục được liệt kê trong biến môi trường PATH.
  • Đề xuất: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths

Nguồn: Đăng ký ứng dụng


15

Từ dấu nhắc lệnh, nếu bạn chỉ nhập WinWordnó sẽ không chạy.

Nếu bạn nhập START WinWordnó chạy.

Các Startlệnh là chìa khóa ở đây.

Khi bạn cố gắng thực thi một tệp thông qua lệnh start, Command Prompt không thực hiện bất kỳ tìm kiếm nào. Thay vào đó, nó chuyển tên tệp (và đối số) cho chính Windows (thông qua lệnh gọi API ShellExecuteEx), sau đó phải tìm kiếm vị trí của tệp. Có một số nơi nó tìm kiếm theo thứ tự sau:

  • Các thư mục làm việc hiện tại.

  • Các Windowsthư mục duy nhất (không có thư mục con được tìm kiếm).

  • Các Windows\System32thư mục.

  • Các thư mục được liệt kê trong PATHbiến môi trường.

  • Đề xuất:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordlà trong khóa đăng ký đó. Chìa khóa là ở đó để tránh PATHbị quá lâu.


7
Xin trích dẫn và trích dẫn tất cả các nguồn. Trừ khi bạn đã viết thứ tự tìm kiếm từ bộ nhớ, bạn nên trích dẫn nguồn của mình, trong đó chỉ ra danh sách và thứ tự tìm kiếm.
Ramhound

Nguồn sẽ là ghi chú của tôi từ một cái gì đó tôi đã làm việc một vài năm trước đây. Tôi không biết tôi đã nhặt nó ở đâu sau đó, các trang web đến và đi.
Larryc

5
Bạn đã nhận được chúng từ cùng một tài liệu mà mọi người khác đã nhận được chúng.
Ramhound

7

Chương trình (khi bạn chỉ định tên mô-đun không có ổ đĩa / đường dẫn trong dấu nhắc lệnh) trong bộ xử lý lệnh Windows (CMD.EXE) có thể được khởi động khi tìm thấy:

  • bởi biến môi trường PATH (cả thực thi và phím cứng / liên kết mềm / phím tắt của nó có cùng tên)

  • bởi bí danh DOSKEY

  • theo đường dẫn ứng dụng từ HKLM\Software\Microsoft\Windows\CurrentVersion\App Pathshoặc HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths(khi sử dụng startlệnh)

Sử dụng kiến ​​thức này (đặc biệt là kiến ​​thức cuối cùng), bạn có thể tạo bí danh của riêng mình thuận tiện cho bạn. Ví dụ: bạn có thể tạo HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exevới giá trị mặc định C:\Program Files (x86)\Audacity\Audacity.exevà khởi động ứng dụng này chỉ bằng cách gõ start auvào dấu nhắc lệnh.


0

Mặc dù các câu trả lời khác có thể là lý do cụ thể trong trường hợp của bạn, nhưng cũng có một câu trả lời khác cho câu hỏi của bạn có thể xảy ra đối với một số ứng dụng khác: ở cùng một nơi bạn đang tìm, nhưng với các phần mở rộng tệp khác nhau.

Bạn đặc biệt nói rằng bạn đang tìm kiếm các tập tin có phần mở rộng exe. Windows cũng sẽ cố gắng thực thi các tập tin của các phần mở rộng khác.

Một biến môi trường khác xuất hiện khi thực hiện lệnh là biến PATHEXT. Đây là ;danh sách giới hạn các phần mở rộng tệp để cố gắng thực thi. Nếu bạn lặp lại, PATHEXTbạn có thể thấy một cái gì đó như .COM;.EXE;.BAT;.CMD;.VBS;... (vv). Một số ứng dụng sử dụng các loại tệp khác này làm điểm vào của người dùng cuối. Nó ít phổ biến hơn nhiều, nhưng nó xảy ra. Tôi đã sử dụng một số sản phẩm thương mại lớn bắt đầu từ .BATcác kịch bản. Để sử dụng một trong số chúng làm ví dụ, tôi có thể bắt đầu nó bằng lệnh standalonemặc dù không có standalone.exe... thay vào đó, nó có một standalone.bat.

Một số tiện ích mở rộng tôi có trên PATHEXTTôi đang tìm kiếm ngay bây giờ Tôi chưa bao giờ sử dụng ứng dụng. Những người mà tôi đã chạy vào nhiều hơn nữa thường (nhưng rõ ràng không phải càng nhiều càng tốt exe) là: .com, .bat, .vbs, .js, .jar. Hai cái đầu tiên là các tệp script bó của windows và ba loại còn lại là các loại tệp cho các ngôn ngữ lập trình cụ thể được chạy từ các tập lệnh hoặc máy ảo thay vì từ exes (tương ứng: visual basic, javascript và java).


Cử tri xuống quan tâm bình luận (tôi biết thường hỏi vô ích, nhưng đôi khi tôi nhận được phản hồi)? Tôi đã phạm sai lầm ở đâu đó?
Loduwijk

Không phải tôi, nhưng theo phỏng đoán hoang dã bởi vì trong khi PATHEXTPATH, cả hai đều liên quan đến việc vận hành mọi thứ, chúng có phần trực giao trong các nhiệm vụ tương ứng. PATHchỉ định nơi cần tìm mọi thứ để chạy và là những gì OP yêu cầu, trong khi PATHEXTchỉ định những gì có thể chạy.
thức

@dgnuff Thật thú vị, vì đó là quan điểm của tôi: OP đặc biệt đặt câu hỏi theo cách đặt ra cho một thách thức khung hình ... theo thuật ngữ SE, họ đã hỏi một "câu hỏi XY" bằng cách đưa ra một giả định rằng tệp đang chạy không phải là ở những nơi đã được tìm kiếm trên đường dẫn. Dù sao cũng cảm ơn.
Loduwijk

0

start winwordkhông cho biết dấu nhắc lệnh để khởi chạy winword. Nó nói với dấu nhắc lệnh để khởi chạy startvới đối số winword. Startsử dụng phương pháp riêng của mình để tìm winword.

Chỉ cần winwordnói với dấu nhắc lệnh để khởi chạy winword. Và nếu bạn thử điều đó, vì winwordkhông có trên PATH, nó sẽ không khởi chạy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.