为什么在命令行中输入不带扩展名的文件时打开文件?


41

在Windows 10上,truffle.js当前文件夹中有一个名为的文件。我truffle在cmd窗口中编写,希望调用truffle驻留在我路径上其他位置的程序。

而是truffle.js在我最喜欢的IDE中打开(.js文件与该IDE关联)。我认为这种行为只是这样的可执行文件,.bat.com.exe。为什么.js文件会发生这种情况?

注意:随后我发现truffle我的路径上根本没有安装任何文件,但是我的问题仍然存在:Windows为什么要完成我在不可执行文件中未指定的扩展名?

即使在安装松露并重新启动cmd之后,我也无法在包含file的文件夹中运行真正的松露truffle.js




因为Windows会打开带有扩展名且具有关联应用程序的任何文件。它使您不必键入,c:\path\application.exe c:\path\filename.ext而不必只是输入filename
ashleedawg

Answers:


75

因为默认%PATHEXT%设置为.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC。注意它是如何包含的.js

这意味着,如果键入名称,CMD将在当前文件夹中查找按此顺序附加了这些扩展名的文件。只有在那之后,它才会考虑其中的内容%PATH%。此行为无法更改。%PATHEXT%但是,您可以像其他任何环境变量一样进行修改。

您可以使用该WHERE命令来检查将打开哪个路径(例如where truffle),它将以与CMD相同的方式自动搜索%PATH%和%PATHEXT%。


3
为了明确起见,您的意思是Windows将接受输入,将这些文件扩展名添加到输入中以查看其是否匹配,然后再查看PATH。
TankorSmash

9
另请注意,OP的原始逻辑成立-这些都是可执行文件(从某种意义上说...),其中一些恰好也是人类可读的。
Adonalsium

2
@TankorSmash Windows CreateProcessShellExecute(Ex)api中一样,我也认为API不在PATHEXT上。扩展名搜索仅在默认Shell(cmd.exe和powershell.exe)中实现。这就是说,CreateProcessShellExecute(Ex) 追加.exe明确。
鲍勃

3
@ hBy2Py,如果攻击者具有足够的访问权限来在系统上植入文件并执行该文件,则无论文件扩展名或%PATHEXT%环境变量的值如何,您都已被搞砸了。
zakinster

2
@ JustinC.B。苹果和橘子。Notepad ++不是Microsoft产品(也不与Windows捆绑在一起,等等)。撇开命名,它相当于Sublime Text甚至VSCode一样多(或很少)替代记事本。另一方面,PowerShell具有第一方支持,并且与旧的命令提示符相比,已越来越成为(捆绑式)默认值,并且最近几年引入的许多新命令仅是PowerShell。
鲍勃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.