コマンドラインで拡張子を付けずに名前を書くと、なぜファイルが開かれますか?


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
アシュリードーグ

回答:


75

%PATHEXT%.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCデフォルトで設定されているため。含まれていることに注意してください.js

つまり、名前を入力すると、CMDは現在のフォルダーでこれらの拡張子がこの順序で追加されたファイルを検索します。その後にのみ、何が入っているかを考慮し%PATH%ます。この動作は変更できません。%PATHEXT%ただし、他の環境変数と同様に変更できます。

WHEREコマンドを使用して、どのパスが開かれるかを確認できます(例where truffle)。これにより、CMDと同じ方法で%PATH%と%PATHEXT%の両方が自動的に検索されます。


3
明確にするために、PATHを調べる前に、Windowsが入力を受け取り、それらのファイル拡張子を入力に追加して、一致するかどうかを確認することを意味します。
TankorSmash

9
また、OPの元のロジックが保持されていることに注意してください-これらはすべて実行可能ファイル(ある意味では...)であり、そのうちのいくつかはたまたま人間が読むこともできます。
アドナルシウム

2
@TankorSmash WindowsはCreateProcessShellExecute(Ex)API でもそうであるように、PATHEXTを参照しません。拡張機能検索は、デフォルトのシェル(cmd.exeおよびpowershell.exe)内でのみ実装されます。いえ、CreateProcessShellExecute(Ex) なります追加し.exe、具体的。
ボブ

3
@ hBy2Py攻撃者がシステムにファイルを作成して実行するのに十分なアクセス権を持っている場合、ファイルの拡張子や%PATHEXT%環境変数の値に関係なく、すでにねじ込まれています。
zakinster

2
@ JustinC.B。リンゴとオレンジ。Notepad ++はMicrosoft製品ではありません(Windowsなどにバンドルされていません)。ちなみに、Sublime TextやVSCodeと同じくらい、Notepadの代替品です。一方、PowerShellはファーストパーティのサポートを備えており、従来のコマンドプロンプトよりも(バンドルされた)デフォルトになりつつあり、過去数年間に導入された新しいコマンドの多くはPowerShell専用です。
ボブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.