Tại sao một tệp được mở khi tôi viết tên của nó, mà không có phần mở rộng, trong dòng lệnh?


41

Trên Windows 10, tôi có một tệp được gọi truffle.jstrong thư mục hiện tại của mình. Tôi viết truffletrong cửa sổ cmd, hy vọng sẽ gọi trufflechương trình nằm ở nơi khác trên đường của tôi.

Thay vào đó, truffle.jsđược mở trong IDE yêu thích của tôi ( .jscác tệp được liên kết với IDE đó). Tôi nghĩ rằng hành vi này chỉ như thế này đối với các tập tin thực thi .bat, .com.exe. Tại sao nó xảy ra cho một .jstập tin?

Lưu ý: Sau đó tôi phát hiện ra tôi không có trufflecài đặt nào trên đường dẫn của mình, nhưng câu hỏi của tôi vẫn là: tại sao Windows hoàn thành tiện ích mở rộng mà tôi không chỉ định trên tệp không thể thực thi?

Ngay cả sau khi cài đặt truffle và khởi động lại cmd, tôi không thể có được truffle thực sự để chạy trong một thư mục chứa tệp truffle.js.




Bởi vì Windows sẽ mở bất kỳ tệp nào có phần mở rộng có ứng dụng liên quan. Nó tiết kiệm cho bạn khỏi phải gõ c:\path\application.exe c:\path\filename.extchứ không phải chỉ filename.
ashleedawg

Câu trả lời:


75

Bởi vì %PATHEXT%được đặt thành .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCmặc định. Lưu ý cách nó chứa .js.

Điều đó có nghĩa là nếu bạn nhập tên, CMD sẽ tìm các tệp có các phần mở rộng này được nối thêm, theo thứ tự đó, trong thư mục hiện tại. Chỉ sau đó nó sẽ xem xét những gì trong %PATH%. Hành vi này không thể thay đổi. Bạn có thể sửa đổi %PATHEXT%mặc dù, giống như bất kỳ biến môi trường khác.

Bạn có thể sử dụng WHERElệnh để kiểm tra đường dẫn nào sẽ được mở (ví dụ where truffle), nó sẽ tự động tìm kiếm cả% PATH% và% PATHEXT% giống như cách mà CMD sẽ làm.


3
Để làm rõ, bạn có nghĩa là các cửa sổ sẽ lấy một đầu vào, thêm các phần mở rộng tệp đó vào đầu vào để xem nó có khớp hay không, trước khi tìm trong PATH.
TankorSmash

9
Cũng lưu ý rằng logic gốc của OP giữ - đây đều là các tệp thực thi (theo nghĩa nào đó của từ này ...), một số trong số chúng cũng có thể đọc được.
Adonalsium

2
@TankorSmash Windows, như trong CreateProcessvà tôi cũng nghĩ rằng các ShellExecute(Ex)API, không nhìn vào PATHEXT. Tìm kiếm tiện ích mở rộng chỉ được triển khai trong các shell mặc định (cmd.exe và powershell.exe). Điều đó nói rằng, CreateProcessShellExecute(Ex) sẽ bổ sung .execụ thể.
Bob

3
@ hBy2Py nếu kẻ tấn công có đủ quyền truy cập để tạo tệp trên hệ thống của bạn và thực thi nó, bạn đã bị lừa, bất kể phần mở rộng tệp hoặc giá trị của %PATHEXT%biến môi trường.
zakinster

2
@ JustinC.B. Táo và cam. Notepad ++ không phải là sản phẩm của Microsoft (và không đi kèm với Windows, v.v.). Đặt tên sang một bên, đó là một (hoặc ít) thay thế cho Notepad như Sublime Text hoặc thậm chí VSCode. Mặt khác, PowerShell có sự hỗ trợ của bên thứ nhất và ngày càng trở thành mặc định (được đóng gói) so với Dấu nhắc lệnh kế thừa và phần lớn các lệnh mới được giới thiệu trong vài năm qua chỉ dành cho PowerShell.
Bob
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.