Il Prompt dei comandi di Windows cerca in un luogo diverso da quelli specificati dalla variabile PATH all'avvio dei programmi applicativi?


35

Ho provato il seguente esperimento.

Prima di iniziare, ho controllato la variabile PATH da cmd, che ha il seguente valore:

Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;

Inizialmente, ho pensato che cmd cercasse solo gli eseguibili nelle directory contenute nella variabile PATH, quindi ho scelto casualmente un'applicazione - winword.exe (Microsoft Word), e ho provato ad avviarlo dalla riga di comando:

start winword

Ma con mia sorpresa, il programma si avvia! Il motivo per cui sono sorpreso è perché ho cercato in tutte le directory nella variabile PATH il file exe chiamato 'winword' ma tutte le mie ricerche sono risultate vuote!

Ho quindi concluso che il prompt dei comandi deve aver saputo cercare in luoghi diversi da quelli specificati nella variabile PATH per cercare gli eseguibili.

Quindi, ovviamente, la prossima cosa che ho fatto è stata cercare la posizione precisa in cui si trova il file eseguibile 'winword'. Si scopre che winword.exe si trova qui:

C:\Program Files\Microsoft Office 15\root\office15

Quindi mi stai dando l'idea che forse CMD guarda automaticamente attraverso ProgramFiles e ProgramFiles (x86) (e tutte le loro sottodirectory) quando si esegue il comando 'start'? Il che mi ha portato a provare a lanciare un'altra applicazione installata sul mio computer, Audacity, con il file exe che si trova in:

C:\Program Files (x86)\Audacity

Ancora una volta, con mia grande sorpresa, Audacity non è stato avviato quando ho digitato:

start audacity

alla riga di comando.

inserisci qui la descrizione dell'immagine

Ho quindi aggiunto la directory contenente audacity.exe a PATH:

set path=%path%;C:\Program Files (x86)\Audacity

dopo di che ho provato ad avviare nuovamente audacity:

start audacity

Beh, non sorprende che Audacity sia stata lanciata.

Quello che voglio sapere è dove il prompt dei comandi cerca esattamente gli eseguibili? Perché winword.exe si avvia anche quando la directory che lo contiene non fa parte di PATH, ma la stessa cosa non è vera per audacity.exe?

Ho provato anche altre applicazioni. Chrome e Firefox funzionano quando utilizzo il comando start.

AGGIORNAMENTO: utilizzo Windows versione 6.3.9600 (Windows 8.1)


1
Il nocciolo della mia risposta alla domanda di Kyle Delaney di circa un anno e mezzo fa affronta anche questa domanda.
TOOGAM,

Risposte:


44

Inizialmente, ho pensato che cmd cercasse solo gli eseguibili nelle directory contenute nella variabile PATH, quindi ho scelto casualmente un'applicazione - winword.exe (Microsoft Word) e ho provato ad avviarlo dalla riga di comando:

Il motivo ha winword.exefunzionato è che esiste una chiave di registro che definisce il percorso di Microsoft Word (Winword.exe). Una chiave simile esiste per Firefox.exe e Chrome.exe se tali applicazioni sono installate.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

Quello che voglio sapere è dove il prompt dei comandi cerca esattamente gli eseguibili?

Variabile PATH di sistema, Variabile PATH utente e le varie chiavi all'interno ..\App Paths. Sono stato in grado di confermare che Audacity non crea una chiave per sé quando è installato.

Quando viene chiamata la funzione ShellExecuteEx con il nome di un file eseguibile nel suo parametro lpFile, esistono diversi punti in cui la funzione cerca il file. Si consiglia di registrare l'applicazione nella sottochiave del registro Percorsi app. Ciò evita la necessità per le applicazioni di modificare la variabile di ambiente PATH di sistema.

  • La directory di lavoro corrente.
  • Solo la directory di Windows (non viene cercata alcuna sottodirectory).
  • La directory Windows \ System32.
  • Directory elencate nella variabile d'ambiente PATH.
  • Consigliato: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths

Fonte: registrazione dell'applicazione


15

Dal prompt dei comandi, se si immette WinWordnon riesce a funzionare.

Se si entra START WinWord, corre.

Il Startcomando è la chiave qui.

Quando si tenta di eseguire un file tramite il comando start, il prompt dei comandi non esegue alcuna ricerca. Al contrario, passa il nome del file (e gli argomenti) su Windows stesso (tramite la chiamata API ShellExecuteEx), che deve quindi cercare la posizione del file. Esistono diversi luoghi in cui cerca nel seguente ordine:

  • La directory di lavoro corrente.

  • Solo la Windowsdirectory (non viene cercata alcuna sottodirectory).

  • La Windows\System32directory.

  • Directory elencate nella PATHvariabile d'ambiente.

  • Consigliato:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordè in quella chiave di registro. La chiave è lì per evitare PATHdi allungare troppo.


7
Si prega di citare e citare tutte le fonti. A meno che tu non abbia scritto l'ordine di ricerca dalla memoria, avresti dovuto citare la tua fonte, che indicava l'elenco e l'ordine in cui è stata cercata.
Ramhound,

La fonte sarebbero i miei appunti da qualcosa a cui stavo lavorando un paio di anni fa. Non so dove l'ho raccolto allora, le pagine web vanno e vengono.
Larryc,

5
Li hai presi dalla stessa documentazione da cui tutti gli altri li hanno presi.
Ramhound,

7

Il programma (quando si specifica il nome del suo modulo senza unità / percorso nel prompt dei comandi) nel processore dei comandi di Windows (CMD.EXE) può essere avviato quando viene trovato:

  • dalla variabile d'ambiente PATH (sia eseguibile che hardlink / softlink / scorciatoia con lo stesso nome)

  • dall'alias DOSKEY

  • dal percorso dell'applicazione da HKLM\Software\Microsoft\Windows\CurrentVersion\App Pathso HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths(quando si utilizza il startcomando)

Usando questa conoscenza (specialmente l'ultima) puoi creare i tuoi alias convenienti per te. Ad esempio, è possibile creare HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.execon il valore predefinito di C:\Program Files (x86)\Audacity\Audacity.exee avviare questa applicazione semplicemente digitando il start auprompt dei comandi.


0

Mentre è probabile che le altre risposte siano il motivo specifico nel tuo caso, c'è anche un'altra risposta alla tua domanda che avrebbe potuto essere il caso di alcune altre applicazioni: nello stesso posto in cui stavi cercando, ma con estensioni di file diverse.

Hai detto espressamente che stavi cercando file con estensione exe. Windows tenterà anche di eseguire file di altre estensioni.

Un'altra variabile d'ambiente che entra in gioco quando si esegue un comando è la variabile PATHEXT. Questo è un ;elenco delimitato di estensioni di file da tentare di eseguire. Se fai eco PATHEXTpotresti vedere qualcosa come .COM;.EXE;.BAT;.CMD;.VBS;... (ecc.). Alcune applicazioni utilizzano questi altri tipi di file come punto di ingresso dell'utente finale. È molto meno comune, ma succede. Ho usato diversi importanti prodotti commerciali che partono da .BATscript. Per usarne uno come esempio, posso avviarlo con il comando standaloneanche se non c'è standalone.exe... invece ha un standalone.bat.

Alcune delle estensioni che ho sul PATHEXTsto guardando in questo momento non ho mai avuto un uso dell'applicazione. Quelli che io ho incontrato molto più comunemente (ma ovviamente non tanto quanto exe) sono: .com, .bat, .vbs, .js, .jar. I primi due sono file di script batch di Windows e gli altri tre sono tipi di file per linguaggi di programmazione specifici che vengono eseguiti da script o macchine virtuali anziché da exes (rispettivamente: visual basic, javascript e java).


Ai votanti verso il basso interessa commentare (so che di solito è inutile chiedere, ma a volte ricevo una risposta)? Ho fatto un errore da qualche parte?
Loduwijk,

Non io, ma a una supposizione sfrenata è perché mentre PATHEXTe PATH, entrambi sono collegati a far funzionare le cose, sono in qualche modo ortogonali nei loro rispettivi compiti. PATHspecifica dove cercare le cose da eseguire ed è ciò che l'OP stava chiedendo, mentre PATHEXTspecifica cosa può essere eseguito.
Dgnuff,

@dgnuff Interessante, poiché quello era il mio punto: OP ha formulato specificamente la domanda in un modo che chiedeva una sfida di frame ... in termini SE, stavano ponendo una "domanda XY" ipotizzando che il file in esecuzione non fosse nei luoghi che erano già stati cercati sul percorso. Comunque grazie.
Loduwijk,

0

start winwordnon dice al prompt dei comandi di avviarsi winword. Indica al prompt dei comandi di avviarsi startcon argomento winword. Startusa i propri metodi per trovare winword.

winwordDice solo al prompt dei comandi di avviarsi winword. E se ci provi, dato che winwordnon è sul PATH, non si avvia.

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.