Dlaczego plik jest otwierany, gdy piszę jego nazwę bez rozszerzeń w wierszu poleceń?

41

W systemie Windows 10 mam plik o nazwie truffle.jsw moim bieżącym folderze. Piszę trufflew oknie cmd, oczekując, że wywołam truffleprogram, który znajduje się gdzie indziej na mojej ścieżce.

Zamiast tego truffle.jsotwiera się w moim ulubionym IDE ( .jspliki są powiązane z tym IDE). Myślałem, że to zachowanie jest tylko tak dla plików wykonywalnych .bat, .coma .exe. Dlaczego tak się dzieje z .jsplikiem?

Uwaga: później odkryłem, że wcale nie mam trufflezainstalowanego na mojej ścieżce, ale pozostaje moje pytanie: dlaczego system Windows uzupełnia rozszerzenie, którego nie określiłem w pliku niewykonywalnym?

Nawet po zainstalowaniu trufli i ponownym uruchomieniu cmd nie mogę uruchomić prawdziwej trufli w folderze zawierającym plik truffle.js.

ripper234
źródło
Ponieważ system Windows otworzy każdy plik z rozszerzeniami, które mają powiązaną aplikację. To oszczędza Ci konieczności pisania, c:\path\application.exe c:\path\filename.exta nie tylko pisania filename.
ashleedawg

Odpowiedzi:

75

Ponieważ %PATHEXT%jest ustawiony .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCdomyślnie. Zwróć uwagę, jak to zawiera .js.

Oznacza to, że jeśli wpiszesz nazwę, CMD będzie szukać plików z tymi rozszerzeniami dołączonymi w tej kolejności w bieżącym folderze. Dopiero potem rozważy, co jest w środku %PATH%. Tego zachowania nie można zmienić. Możesz jednak modyfikować %PATHEXT%, jak każdą inną zmienną środowiskową.

Możesz użyć WHEREpolecenia, aby sprawdzić, która ścieżka zostanie otwarta (np. where truffle), Która automatycznie przeszuka zarówno% PATH%, jak i% PATHEXT% w taki sam sposób, jak CMD.

Daniel B.
źródło
3
Aby to wyjaśnić, masz na myśli, że system Windows pobierze dane wejściowe, dodaj te rozszerzenia plików, aby sprawdzić, czy pasują, zanim przejrzysz ścieżkę.
TankorSmash
9
Zauważ też, że oryginalna logika OP - wszystkie są plikami wykonywalnymi (w pewnym sensie tego słowa ...), niektóre z nich są po prostu czytelne dla człowieka.
Adonalsium
2
@TankorSmash Windows, podobnie jak CreateProcessi myślę, że również ShellExecute(Ex)API, nie patrzy na PATHEXT. Wyszukiwanie rozszerzeń jest realizowane tylko w domyślnych powłokach (cmd.exe i powershell.exe). To powiedziawszy, CreateProcessi ShellExecute(Ex) będzie dodawać .exekonkretnie.
Bob
3
@ hBy2Py, jeśli osoba atakująca ma wystarczający dostęp do umieszczenia pliku w systemie i wykonania go, jesteś już wkręcony, bez względu na rozszerzenie pliku lub wartość %PATHEXT%zmiennej środowiskowej.
zakinster
2
@ JustinC.B. Jabłka i Pomarańcze. Notepad ++ nie jest produktem Microsoft (i nie jest dołączany do systemu Windows itp.). Odkładając na bok, to tyle samo (lub niewiele) zamienników Notatnika, co Sublime Text, a nawet VSCode. Z drugiej strony, PowerShell ma własne wsparcie i coraz częściej staje się domyślnym (dołączonym) domyślnym w stosunku do starszego wiersza polecenia, a wiele nowych poleceń wprowadzonych w ciągu ostatnich kilku lat jest tylko PowerShell.
Bob