Почему файл открывается, когда я пишу его имя без расширений в командной строке?


41

В Windows 10 у меня есть файл, который называется truffle.jsв моей текущей папке. Я пишу truffleв окне cmd, ожидая вызова truffleпрограммы, которая находится в другом месте моего пути.

Вместо этого truffle.jsоткрывается в моей любимой IDE ( .jsфайлы связаны с этой IDE). Я думал, что это поведение только для исполняемых файлов .bat, .comи .exe. Почему это происходит для .jsфайла?

Примечание. Впоследствии я обнаружил, что truffleна моем пути вообще ничего не установлено, но остается вопрос: почему Windows завершает расширение, которое я не указал для неисполняемого файла?

Даже после установки трюфеля и перезапуска cmd я не могу заставить настоящий трюфель запускаться в папке, содержащей файл truffle.js.




Потому что Windows откроет любой файл с расширениями, с которыми связано приложение. Это избавляет вас от необходимости печатать, c:\path\application.exe c:\path\filename.extа не просто filename.
ashleedawg

Ответы:


75

Потому %PATHEXT%что установлено .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCпо умолчанию. Обратите внимание, как оно содержится .js.

Это означает, что если вы введете имя, CMD будет искать файлы с этими расширениями, добавленными в указанном порядке в текущую папку. Только после этого он будет считать, что в %PATH%. Это поведение не может быть изменено. Вы можете изменить %PATHEXT%, как и любую другую переменную окружения.

Вы можете использовать WHEREкоманду, чтобы проверить, какой путь будет открыт (например where truffle), который будет автоматически искать и% PATH%, и% PATHEXT% так же, как CMD.


3
Чтобы уточнить, вы имеете в виду, что окна будут принимать входные данные, добавьте эти расширения файлов к входным данным, чтобы увидеть, совпадают ли они, прежде чем искать в PATH.
TankorSmash

9
Также обратите внимание, что оригинальная логика OP справедлива - это все исполняемые файлы (в некотором смысле слова ...), некоторые из них просто читаются человеком.
Адональсиум

2
@TankorSmash Windows, как CreateProcessи, я думаю, и ShellExecute(Ex)API, не смотрит на PATHEXT. Поиск по расширению реализован только в оболочках по умолчанию (cmd.exe и powershell.exe). Тем не менее, CreateProcessи ShellExecute(Ex) будет добавлять в .exeчастности.
Боб

3
@ hBy2Py, если злоумышленник имеет достаточный доступ для установки файла в вашей системе и его запуска, вы уже испорчены, независимо от расширения файла или значения %PATHEXT%переменной среды.
Закинстер

2
@ JustinC.B. Яблоки и апельсины. Notepad ++ не является продуктом Microsoft (и не входит в комплект Windows и т. Д.). Если оставить в стороне, это такая же (или маленькая) замена Блокнота, как Sublime Text или даже VSCode. PowerShell, с другой стороны, имеет первоклассную поддержку и все чаще становится (в комплекте) по умолчанию по сравнению с устаревшей командной строкой, и большинство новых команд, введенных за последние несколько лет, предназначены только для PowerShell.
Боб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.