Perché un file viene aperto quando scrivo il suo nome, senza estensioni, nella riga di comando?


41

Su Windows 10, ho un file chiamato truffle.jsnella mia cartella corrente. Scrivo trufflenella finestra cmd, aspettandomi di invocare il truffleprogramma che risiede altrove sul mio percorso.

Invece, truffle.jsviene aperto nel mio IDE preferito (i .jsfile sono associati a tale IDE). Ho pensato che questo comportamento fosse così solo per i file eseguibili .bat, .come .exe. Perché succede per un .jsfile?

Nota: in seguito ho scoperto di non aver truffleinstallato affatto sul mio percorso, ma la mia domanda rimane: perché Windows sta completando l'estensione che non ho specificato su un file non eseguibile?

Anche dopo aver installato il tartufo e aver riavviato cmd, non riesco a far funzionare il vero tartufo in una cartella che contiene un file truffle.js.




Perché Windows aprirà qualsiasi file con estensioni a cui è associata un'applicazione. Ti sta salvando dal dover scrivere c:\path\application.exe c:\path\filename.extpiuttosto che semplicemente filename.
ashleedawg,

Risposte:


75

Perché %PATHEXT%è impostato di .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSCdefault. Nota come contiene .js.

Ciò significa che se si digita un nome, CMD cercherà i file con queste estensioni aggiunti, in questo ordine, nella cartella corrente. Solo dopo ciò prenderà in considerazione ciò che è dentro %PATH%. Questo comportamento non può essere modificato. Puoi %PATHEXT%comunque modificarlo , come qualsiasi altra variabile d'ambiente.

È possibile utilizzare il WHEREcomando per verificare quale percorso verrà aperto (ad es. where truffle), Che cercherà automaticamente% PATH% e% PATHEXT% allo stesso modo di CMD.


3
Per chiarire, vuoi dire che Windows prenderà un input, aggiungi quelle estensioni di file all'input per vedere se corrisponde, prima di guardare nel PERCORSO.
TankorSmash,

9
Nota anche che la logica originale di OP è valida: sono tutti eseguibili (in un certo senso della parola ...), alcuni di essi sono anche leggibili dall'uomo.
Adonalsium,

2
@TankorSmash Windows, come in CreateProcesse penso anche alle ShellExecute(Ex)API, non guarda PATHEXT. La ricerca dell'estensione è implementata solo all'interno delle shell predefinite (cmd.exe e powershell.exe). Detto questo, CreateProcesse ShellExecute(Ex) lo aggiungerò in modo .exespecifico.
Bob,

3
@ hBy2Py se un attaccante ha abbastanza accesso per piantare un file sul tuo sistema ed eseguirlo, sei già fregato, indipendentemente dall'estensione del file o dal valore della %PATHEXT%variabile d'ambiente.
zakinster,

2
@ JustinC.B. Mele e arance Notepad ++ non è un prodotto Microsoft (e non fornito in bundle con Windows, ecc.). Nominando a parte, è un sostituto per Notepad (o poco più) di Sublime Text o persino VSCode. PowerShell, d'altra parte, ha il supporto di prima parte e sta diventando sempre più il default (in bundle) sul prompt dei comandi legacy e molti dei nuovi comandi introdotti negli ultimi anni sono solo PowerShell.
Bob,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.