¿Por qué se abre un archivo cuando escribo su nombre, sin extensiones, en la línea de comando?

41

En Windows 10, tengo un archivo llamado truffle.jsen mi carpeta actual. Escribo truffleen la ventana de cmd, esperando invocar el truffleprograma que reside en otra parte de mi camino.

En cambio, truffle.jsse abre en mi IDE favorito (los .jsarchivos están asociados con ese IDE). Pensé que este comportamiento es solo así para los archivos ejecutables .bat, .comy .exe. ¿Por qué sucede para un .jsarchivo?

Nota: Posteriormente descubrí que no tengo nada truffleinstalado en mi ruta, pero mi pregunta sigue siendo: ¿por qué Windows está completando la extensión que no especifiqué en un archivo no ejecutable?

Incluso después de instalar trufa y reiniciar cmd, no puedo hacer que la trufa real se ejecute en una carpeta que contiene un archivo truffle.js.

ripper234
fuente
Porque Windows abrirá cualquier archivo con extensiones que tengan una aplicación asociada. Le ahorra tener que escribir en c:\path\application.exe c:\path\filename.extlugar de simplemente filename.
ashleedawg

Respuestas:

75

Porque %PATHEXT%está configurado .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCpor defecto. Tenga en cuenta cómo contiene .js.

Eso significa que si escribe un nombre, CMD buscará archivos con estas extensiones agregadas, en ese orden, en la carpeta actual. Solo después de eso considerará lo que hay dentro %PATH%. Este comportamiento no se puede cambiar. Sin %PATHEXT%embargo, puede modificar , como cualquier otra variable de entorno.

Puede usar el WHEREcomando para verificar qué ruta se abriría (por ejemplo where truffle), que buscará automáticamente tanto% PATH% como% PATHEXT% de la misma manera que lo haría CMD.

Daniel B
fuente
3
Para aclarar, quiere decir que Windows tomará una entrada, agregue esas extensiones de archivo a la entrada para ver si coincide, antes de buscar en la RUTA.
TankorSmash
99
También tenga en cuenta que la lógica original de OP se cumple: todos estos son ejecutables (en cierto sentido de la palabra ...), algunos de ellos también son legibles para los humanos.
Adonalsium
2
@TankorSmash Windows, como en CreateProcessy creo que también las ShellExecute(Ex)API, no mira PATHEXT. La búsqueda de extensiones solo se implementa dentro de los shells predeterminados (cmd.exe y powershell.exe). Dicho esto, CreateProcessy ShellExecute(Ex) se anexará .exeespecíficamente.
Bob
3
@ hBy2Py si un atacante tiene suficiente acceso para plantar un archivo en su sistema y ejecutarlo, ya está jodido, sin importar la extensión del archivo o el valor de la %PATHEXT%variable de entorno.
zakinster
2
@ JustinC.B. Manzanas y naranjas. Notepad ++ no es un producto de Microsoft (y no está incluido con Windows, etc.). Nombrando a un lado, es tanto (o poco) un reemplazo para el Bloc de notas como Sublime Text o incluso VSCode. PowerShell, por otro lado, tiene soporte de primera parte y se está convirtiendo cada vez más en el valor predeterminado (incluido) sobre el símbolo del sistema heredado, y muchos de los nuevos comandos introducidos en los últimos años son solo de PowerShell.
Bob