Aggiungi una directory e tutte le sottodirectory alla variabile PATH con una singola voce


19

Ho una directory nella mia cartella home in cui inserisco il software da riga di comando (CMD_Software). Ho inserito ciascun software nella sua directory all'interno di CMD_Software per evitare disordine.

Vorrei fare una singola voce nella mia variabile PATH che consentirà l'accesso a CMD_Software e tutte le directory che contiene dalla riga di comando.

Ci ho provato C:\Users\myuser\CMD_Software\*ma non ha fatto nulla. Questo è il punto in cui ho finito le idee.

Si noti che non sto cercando di impostare un nuovo percorso mentre nel terminale, sto cercando di impostare un nuovo percorso nelle "Variabili d'ambiente" disponibili nella scheda "Avanzate" di Proprietà del sistema.


Hai provato qualcosa come `C: \ Users \ myuser \ CMD_Software *`?
terdon,

4
Non penso sia possibile.
Harry Johnston,

Risposte:


16

La variabile PATH non supporta i caratteri jolly o la ricorsione. Questo è di progettazione.

Esistono due possibili soluzioni che ho usato in alcune occasioni:

  • Crea una directory con semplici file batch e aggiungi quella directory al PERCORSO. Ogni file batch può avviare il programma desiderato, ad esempio:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    La prima riga è un commento, la seconda inizia con @per evitare di mostrare il comando in esecuzione e %*viene utilizzata per passare qualsiasi argomento della riga di comando a EXE.

  • Aggiungi alias a CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Ciò si traduce essenzialmente CMD_Softwarenel prompt dei comandi in tutto dopo il segno di uguale. Il $*viene sostituito con gli argomenti forniti.

Preferisco il secondo approccio, perché puoi raggruppare tutti gli alias in un singolo file (vedi l'opzione "/ MACROFILE" in DOSKEY /?) E farlo eseguire automaticamente ogni volta che l'interprete dei comandi inizia a usare un'impostazione del registro (vedi la chiave "AutoRun" in CMD /?).

Uno svantaggio del secondo metodo è che gli alias funzionano solo all'inizio di una riga di comando. Questo può essere un problema se si desidera eseguire il chain chain dei comandi. Ad esempio, CLS & CMD_Softwarenon funzionerà se non inserisci l'alias in una riga separata usando le parentesi:

CLS & (
CMD_Software
)

Ogni volta che questo diventa un problema, mi limito a ricorrere all'approccio del file batch.


Grazie! Il primo metodo funziona davvero bene per me, soprattutto perché non devo pasticciare con il registro quando trasferisco i miei dati tra computer. È anche abbastanza ordinato e conveniente poiché hai solo un po 'più di tempo per creare un file bat quando ottieni detta utilità.
cyqsimon,

Purtroppo devo redigere la mia precedente dichiarazione così rapidamente. Ho riscontrato strani problemi con gli script usciti casualmente a metà dell'esecuzione dopo aver adottato il primo metodo. In particolare, wget per Windows sembra divertirsi a uccidere il mio script dopo aver terminato il download. Ho perso le ultime due ore a risolvere dolorosamente il mio script, ma alla fine ho provato a gettare tutti gli ex in una singola directory root e i problemi sono scomparsi. Pertanto consiglierei vivamente la cautela prima che qualcuno entri in questo metodo.
cyqsimon,

4

Questo è quello che uso per risolvere il problema. Copia questo script di seguito e salvalo come FIXPATH.BATnella cartella che hai aggiunto alla PATHvariabile di ambiente. Per esempio:

C: \ Users \ myuser \ CMD_Software \

Ora ogni volta che devi eseguire un programma che si trova in una sottocartella, dì ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
o
C: \ Users \ myuser \ CMD_Software \ imagetools \ exiftool.exe

Esegui fixpathprima quindi inserisci il comando (ad es. grepO exiftool) in questo modo:

Microsoft Windows [Versione 6.3.9600]
(c) 2013 Microsoft Corporation. Tutti i diritti riservati.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> ExifTool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

per / R %% d in (.) do (
    imposta "dirs =! dirs!; %% d"
)

path = percorso%%! dirs!
(endlocal
    imposta "ret =% PATH%"
)
cmd / K "title [#] Path Fixed [#] && path% ret%"
uscita / B

Grazie alla risposta di @ VonC


1

Inserisci una sottodirectory "Programmi" in ... \ CMD_Software (o ovunque, in realtà) e riempila con collegamenti simbolici o hardlink a ciascun eseguibile a cui desideri accedere. Quindi sarà sufficiente una singola voce nel PERCORSO per ... \ programmi.


1
Il problema principale è che se ci sono librerie dalle quali l'eseguibile dipende che si trova potenzialmente nella stessa directory di exe, non verranno utilizzate. O almeno è quello che sta succedendo con il mio tentativo con questo.
zero298,

Ottima osservazione, @ zero298. Anche se mi piacerebbe, se qualcuno è sicuro al 100% e posso confermare questo è effettivamente vero piacere a carillon a. (Causa questo metodo è comunque il più pulito in assoluto di tutti.)
Henrik

-1

Se non sei troppo scoraggiato dall'idea, puoi copiare i tuoi strumenti da riga di comando nella directory Windows \ System32. Quindi puoi eseguirli da qualsiasi directory, proprio come ping o ipconfig.

modifica
Dopo aver armeggiato un po ', questo è possibile. Hai solo bisogno di usare i punti e virgola per delimitare le tue directory. Supponiamo che tu abbia un programma in "cartella1" e "cartella2". Scriveresti il ​​tuo percorso in questo modo:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Quindi è possibile chiamare un programma in una delle directory direttamente dalla riga di comando. AFAIK non c'è altro modo per farlo con una sola linea.

Informazioni di supporto: http://en.wikipedia.org/wiki/PATH_(variable)


1
Questo non ha molto senso. 1. Ciò cancellerebbe qualsiasi contenuto precedente della variabile PATH . 2. La variabile PATH conterrebbe solo la cartella, non le sue sottodirectory (risultato desiderato). 3. Invocare program.batcome %PATH%\program.batè più o meno il contrario di ciò per cui PATH è progettato.
Dennis,
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.