Por que um arquivo é aberto quando escrevo seu nome, sem extensões, na linha de comando?

41

No Windows 10, tenho um arquivo chamado truffle.jsna minha pasta atual. Eu escrevo trufflena janela do cmd, esperando chamar o truffleprograma que reside em outro lugar no meu caminho.

Em vez disso, truffle.jsé aberto no meu IDE favorito (os .jsarquivos estão associados a esse IDE). Eu pensei que este comportamento é única como este para arquivos executáveis, .bat, .come .exe. Por que isso acontece com um .jsarquivo?

Nota: Descobri subseqüentemente que não tenho nenhum truffleinstalado no meu caminho, mas minha pergunta permanece: por que o Windows está concluindo a extensão que não especifiquei em um arquivo não executável?

Mesmo depois de instalar a trufa e reiniciar o cmd, não consigo executar a trufa real em uma pasta que contém um arquivo truffle.js.

ripper234
fonte
Porque o Windows abrirá qualquer arquivo com extensões que tenham um aplicativo associado. Isso evita que você precise digitar c:\path\application.exe c:\path\filename.exte não apenas filename.
ashleedawg

Respostas:

75

Porque %PATHEXT%está definido como .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCpadrão. Observe como ele contém .js.

Isso significa que, se você digitar um nome, o CMD procurará arquivos com essas extensões anexadas, nessa ordem, na pasta atual. Somente depois disso será considerado o que está dentro %PATH%. Este comportamento não pode ser alterado. Você pode modificar %PATHEXT%, como qualquer outra variável de ambiente.

Você pode usar o WHEREcomando para verificar qual caminho seria aberto (por exemplo where truffle), que pesquisará automaticamente% PATH% e% PATHEXT% da mesma maneira que o CMD faria.

Daniel B
fonte
3
Para esclarecer, você quer dizer que o Windows terá uma entrada, adicione essas extensões de arquivo à entrada para ver se ela corresponde, antes de procurar no CAMINHO.
TankorSmash
9
Observe também que a lógica original do OP é válida - todos são executáveis ​​(em algum sentido da palavra ...), alguns deles também são legíveis por humanos.
Adonalsium
2
O @TankorSmash Windows, como nas APIs CreateProcesse também acho que ShellExecute(Ex), não olha para o PATHEXT. A pesquisa de extensão é implementada apenas dentro dos shells padrão (cmd.exe e powershell.exe). Dito isto, CreateProcesse ShellExecute(Ex) vai acrescentar .exeespecificamente.
Bob
3
@ hBy2Py Se um invasor tiver acesso suficiente para plantar um arquivo no seu sistema e executá-lo, você já está ferrado, independentemente da extensão do arquivo ou do valor da %PATHEXT%variável de ambiente.
zakinster
2
@ JustinC.B. Maçãs e laranjas. O Notepad ++ não é um produto da Microsoft (e não vem com o Windows etc.). Nomeando à parte, é tanto (ou pouco) um substituto para o Bloco de Notas quanto Sublime Text ou VSCode. O PowerShell, por outro lado, tem suporte de terceiros e está se tornando cada vez mais o padrão (incluído) no Prompt de Comando herdado, e muitos dos novos comandos introduzidos nos últimos anos são apenas do PowerShell.
Bob