为什么当我在命令行中写入文件名时打开文件,没有扩展名?

rip*_*234 42 windows cmd.exe

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

相反,truffle.js在我最喜欢的 IDE 中打开(.js文件与该 IDE 相关联)。我认为这种行为仅适​​用于可执行文件.bat.com.exe. 为什么它会发生在一个.js文件上?

注意:我后来发现truffle我的路径上根本没有安装,但我的问题仍然存在:为什么 Windows 完成了我没有在非可执行文件上指定的扩展?

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

Dan*_*l B 76

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

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

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

  • 另请注意,OP 的原始逻辑成立 - 这些都是可执行文件(从某种意义上说......),其中一些恰好也是人类可读的。 (9认同)
  • 澄清一下,您的意思是 Windows 将接受一个输入,在查看 PATH 之前,将这些文件扩展名添加到输入中以查看它是否匹配。 (3认同)
  • @hBy2Py 如果攻击者有足够的权限在您的系统上植入文件并执行它,那么无论文件扩展名或“%PATHEXT%”环境变量的值如何,您都已经被搞砸了。 (3认同)
  • @TankorSmash Windows,就像在`CreateProcess` 中一样,我认为还有`ShellExecute(Ex)` API,不考虑PATHEXT。扩展搜索仅在默认 shell(cmd.exe 和 powershell.exe)中实现。也就是说,`CreateProcess` 和`ShellExecute(Ex)` * 将* 附加到`.exe`。 (2认同)
  • @贾斯汀C.B. 苹果和橙子。Notepad++ 不是 Microsoft 产品(并且不与 Windows 等捆绑在一起)。除了命名之外,它与 Sublime Text 甚至 VSCode 一样多(或少)替代了记事本。另一方面,PowerShell 拥有第一方支持,并且越来越成为传统命令提示符的(捆绑)默认设置,并且过去几年引入的许多新命令仅适用于 PowerShell。 (2认同)