W systemie Windows 10 mam plik o nazwie truffle.js
w moim bieżącym folderze. Piszę truffle
w oknie cmd, oczekując, że wywołam truffle
program, który znajduje się gdzie indziej na mojej ścieżce.
Zamiast tego truffle.js
otwiera się w moim ulubionym IDE ( .js
pliki są powiązane z tym IDE). Myślałem, że to zachowanie jest tylko tak dla plików wykonywalnych .bat
, .com
a .exe
. Dlaczego tak się dzieje z .js
plikiem?
Uwaga: później odkryłem, że wcale nie mam truffle
zainstalowanego 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
.
c:\path\application.exe c:\path\filename.ext
a nie tylko pisaniafilename
.Odpowiedzi:
Ponieważ
%PATHEXT%
jest ustawiony.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
domyś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ć
WHERE
polecenia, 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.źródło
CreateProcess
i 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,CreateProcess
iShellExecute(Ex)
będzie dodawać.exe
konkretnie.%PATHEXT%
zmiennej środowiskowej.