risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come evitare di sovra-compilare la variabile d'ambiente PATH in Windows?

Mi piacerebbe sapere quali sono gli approcci che usi per gestire gli eseguibili nel tuo sistema. Ad esempio, ho quasi tutto accessibile tramite la riga di comando, ma ora vengo al limite della stringa del percorso, quindi non posso aggiungere altre dir.

Quindi cosa raccomandi? Molto tempo fa, ho provato a usare i softlink degli eseguibili in un Dir appartenente al percorso, ma quell'approccio non funzionava . Lanciare il "solo eseguibile" a un noto Dir, ha i problemi che quasi tutte le applicazioni richiedono un insieme di file, quindi anche questo è cattivo . Lancia l'eseguibile e tutti i suoi file su una Dir conosciuta, mmm funzionerà, ma la possibilità di ottenere un conflitto in il nome dei file è molto alto . Crea un HardLink? Non lo so. Cosa pensi?

106
mjsr

Un modo in cui posso pensare è usare altre variabili d'ambiente per memorizzare percorsi parziali; per esempio, se lo hai

C:\this_is_a\long_path\that_appears\in_multiple_places\subdir1;
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir2;

allora puoi creare una nuova variabile d'ambiente come

SET P1=C:\this_is_a\long_path\that_appears\in_multiple_places

dopo di che diventano i tuoi percorsi originali

%P1%\subdir1;
%P1%\subdir2;

EDIT: Un'altra opzione è quella di creare una directory bin che contiene i file .bat che puntano ai file .exe appropriati.

EDIT 2: Il commento di Ben Voigt ad un'altra risposta menziona che l'uso di altre variabili d'ambiente come suggerito potrebbe non ridurre la lunghezza di %PATH% perché sarebbero espanse prima di essere memorizzate. Questo potrebbe essere vero e non l'ho testato per questo. Un'altra opzione è usare i moduli 8dot3 per nomi di directory più lunghi, ad esempio C:\Program Files è in genere equivalente a C:\PROGRA~1. Puoi usare dir /x per vedere i nomi più brevi.

EDIT 3: Questo semplice test mi fa credere che Ben Voigt abbia ragione.

set test1=hello
set test2=%test1%hello
set test1=bye
echo %test2%

Alla fine di questo, vedi output hellohello piuttosto che byehello.

EDIT 4: Nel caso in cui decidessi di usare file batch per eliminare determinati percorsi da %PATH%, potresti essere preoccupato di come passare argomenti dal tuo file batch al tuo eseguibile in modo tale che il processo sia trasparente (cioè hai vinto Non notare alcuna differenza tra chiamare il file batch e chiamare l'eseguibile). Non ho molta esperienza nello scrivere file batch, ma sembra funzionare bene.

@echo off

rem This batch file points to an executable of the same name
rem that is located in another directory. Specify the directory
rem here:

set actualdir=c:\this_is\an_example_path

rem You do not need to change anything that follows.

set actualfile=%0
set args=%1
:beginloop
if "%1" == "" goto endloop
shift
set args=%args% %1
goto beginloop
:endloop
%actualdir%\%actualfile% %args%

Come regola generale, dovresti fare attenzione nell'esecuzione di file batch da Internet, dato che puoi fare ogni sorta di cose con file batch come la formattazione del tuo disco rigido. Se non ti fidi del codice sopra (che ho scritto), puoi testarlo sostituendo la linea

%actualdir%\%actualfile% %args%

con

echo %actualdir%\%actualfile% %args%

Idealmente dovresti sapere esattamente cosa fa ogni linea prima di eseguirla.

81
Mitch Schwartz

Questo analizzerà la tua variabile d'ambiente% PATH% e convertirà ogni directory nel suo equivalente a breve nome e poi rimetterà tutto in ordine:

@echo off

SET MyPath=%PATH%
echo %MyPath%
echo --

setlocal EnableDelayedExpansion

SET TempPath="%MyPath:;=";"%"
SET var=
FOR %%a IN (%TempPath%) DO (
    IF exist %%~sa (
        SET "var=!var!;%%~sa"
    ) ELSE (
        echo %%a does not exist
    )
)

echo --
echo !var:~1!

Prendi l'output e aggiorna la variabile PATH in variabili d'ambiente.

77
Todd Smith

se si utilizza Windows Vista o versioni successive, è possibile creare un collegamento simbolico alla cartella. per esempio:

mklink /d C:\pf "C:\Program Files"

farebbe un collegamento così c:\pf sarebbe la tua cartella program files. Ho eliminato 300 caratteri dal mio percorso usando questo trucco.

27
bmg002

Nel caso qualcuno sia interessato ...

Trovo che non ho mai veramente bisogno di tutti quei percorsi contemporaneamente, quindi creo un gruppo di file batch di "inizializzazione" che modificano il percorso di conseguenza.

Ad esempio, se volessi fare uno sviluppo in C++ in Eclipse, farei:

> initmingw
> initeclipse
> Eclipse

Questo è utile anche per evitare conflitti tra file eseguibili con lo stesso nome (come i compilatori C++ e D, che hanno entrambi un make.exe).

I miei file batch di solito hanno questo aspetto:

@echo off
set PATH=C:\Path\To\My\Stuff1;%PATH%
set PATH=C:\Path\To\My\Stuff2;%PATH%

Trovo questo approccio relativamente pulito e non ho ancora incontrato alcun problema.

10
YellPika

Generalmente non mi devo preoccupare di questo (non ho raggiunto un limite di dimensioni del percorso - non so nemmeno cosa sia sui moderni sistemi Windows), ma ecco cosa potrei fare per evitare di mettere la directory di un programma in il sentiero:

  • la maggior parte delle utilità della riga di comando viene lanciata in una directory c:\util che si trova sul percorso
  • altrimenti, aggiungerò un semplice file cmd/batch alla directory c:\util che assomiglia a qualcosa del tipo:

    @"c:\program files\whereever\foo.exe" %*
    

che essenzialmente crea un alias per il comando. Non è necessariamente perfetto. Alcuni programmi insistono sul fatto di essere nel percorso (al giorno d'oggi è piuttosto raro), e altri programmi che tentano di invocarlo potrebbero non trovarlo correttamente. Ma per la maggior parte degli usi funziona bene.

Ma in generale, non ho dovuto preoccuparmi di evitare di aggiungere directory al percorso.

6
Michael Burr

Un'altra idea: utilizzare DIR/X per determinare i nomi brevi generati per nomi file Non-8dot3. Quindi utilizzali nel% PATH%.

Ad esempio, "C:\Programmi" diventa "C:\PROGRA ~ 1".

5
Android Eve

Utilizzare la chiave del Registro di sistema Percorso app anziché la variabile percorso per i percorsi specifici dell'applicazione:

http://msdn.Microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

5
Mad Hatter

Ho scritto e utilizzato ogni volta un programma standard stream (stdin/stderr/stdout) e codice di uscita PROXY (chiamato dispatcher https://github.com/131/dispatcher )

Tutto il programma CLI che uso (nodo, php, python, git, svn, rsync, plink ...) sto usando sono in realtà lo stesso file exe (circa 10kb, che ho appena chiamato in modo diverso), che ho messo nello stesso directory. Un file di testo non crittografato statico fa il "nome del file proxy per mappatura exe reale".

Dispatcher utilizza API Win32 di gestione processi di basso livello per essere assolutamente trasparenti.

Usando questo software, ho solo UNA directory aggiuntiva nel mio PERCORSO per tutti i programmi che potrei usare.

1
131

Creando una cartella c:\bin aggiungendo al tuo percorso e l'hardlinking come hai detto potrebbe accorciare la stringa. Magari aggiungi una variabile pf al sistema vars con valore c:\Programmi quindi sostituisci c:\Programmi con% pf% nel percorso.

Modificare:

Creare un disco virtuale . Subst p: "c:\program files"

1
troynt

Le soluzioni di cui sopra funzionano solo se puoi tagliare il tuo percorso. Nel mio caso, non era davvero un'opzione, ed era una seccatura dover eseguire uno script ogni volta che aprivo un prompt dei comandi. Così ho scritto un semplice script che si avvia automaticamente all'apertura del comando Prompt e aggiunge il contenuto di un file di testo al tuo percorso.

Ci sono anche alcuni contesti in cui l'esecuzione di questo script rompe le cose (ad esempio, in una shell github o cygwin), quindi ho aggiunto anche un file che contiene un elenco di percorsi che, se il comando Prompt viene avviato in essi, la variabile path non è 'cambiato tramite lo script di avvio che normalmente aggiorna il percorso.

@echo off

:: Modify these to the actual paths of these two files
set dontSetupFile=C:\Users\Yams\Dontsetup.txt
set pathFile=C:\Users\Yams\Path.txt

:: Retrieve the current path (for determining whether or not we should append to our path)
set curDir=%cd%

:: Be done if the current path is listed in the dontSetupFile
SetLocal EnableDelayedExpansion
for /F "delims=" %%i in (%dontSetupFile%) do (
    if "%%i"=="%curDir%" GOTO AllDone
)



:: Append the pathFile to our current PATH
set pathAppend=
for /F "delims=" %%i in (%pathFile%) do (set pathAppend=!pathAppend!%%i)

set PATH=%PATH%;%pathAppend%


:: The only way to actually modify a command Prompt's path via a batch file is by starting
::   up another command Prompt window. So we will do this, however, if this script is
::   automatically called on startup of any command Prompt window, it will infinately 
::   recurse and bad things will happen.

:: If we already ran, we are done
if "%yams%"=="onion" GOTO AllDone

:: Otherwise, flag that we just ran, and then start up a new command Prompt window
::   with this flag set
set yams=onion

cmd \K set PATH=%PATH%;

:: When that command Prompt exits, it will load back up this command Prompt window, and
::   then the user will need to exit out of this as well. This causes this window to
::   automatically exit once the cmd it just spawned is closed.
exit()

:: Path is set up, we are done!
:AllDone
@echo on

E Path.txt avrà un aspetto simile

C:\Program Files (x86)\Google\google_appengine;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn;
C:\Program Files\Microsoft DNX\Dnvm;
C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit;

Mentre Dontsetup.txt avrà un aspetto simile

C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit
C:\Program Files (x86)\Git\cmd
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

Per farlo funzionare automaticamente all'avvio, apri regedit, vai a HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Command Processor, quindi fai clic destro sulla destra e premi new -> Valore multistringa. Chiamalo su AutoRun. Imposta il suo valore a 

C:\Users\Yams\setUpPath.bat

o in qualsiasi altro luogo in cui hai archiviato il file batch sopra. 

0
Phylliida

Non l'ho provato, ma suddividendo il PERCORSO in parti lavorate e unendole a lavoro variabile finale?

Esempio inizialmente diciamo che hai qualcosa come

PATH={LONGPATH1};{LONGPATH2};....{2048th char}....{LONGPATH_N-1};{LONGPATH_N}

Invece crei:

_PATH1 = {LONGPATH1};{LONGPATH2};....{2048 char}
_PATH2 = {2049th char}...{LONGPATH_N-1};{LONGPATH_N}
rem // may be more parts
PATH = %_PATH1%;%_PATH2%
0
Philipp Munin

Seguo questi passaggi per rendere gestibili le voci:

  1. Creato utenti diversi per diverse combinazioni di pacchetti software. Uso. Esempio: (a) Creato un Web utente per rendere disponibile tutto il software di sviluppo web; (b) Creazione di un database utente per rendere disponibili tutti i pacchetti software di database e di data warehousing. Ricorda che alcuni software possono creare più di una voce. O a volte lo suddivido in specifici utenti specifici di Oracle e MSSQL e Oracle specifici. Metto MySQL/PostgreSQL, Tomcat, wamp, xamp all nell'account utente webr.

  2. Se possibile installa pacchetti comuni come office, photoshop, .. come sistema specifico disponibile per tutti gli utenti e pacchetti speciali come utente specifico. Naturalmente ho dovuto accedere a diversi utenti e installarli. Non tutto il software può fornire questa opzione. Se l'opzione "installa solo per questo utente" non è disponibile, installala per l'intero sistema.

  3. Evito di installare programmi nella cartella Program File (x86) o in Program File. Io installo sempre nella directory di base. Ad esempio, MySQL 64 bit va in "C:\mysql64" e MySQL 32 bit va nella cartella "C:\mysql". Suppongo sempre di aggiungere un suffisso 64 solo per il software a 64 bit. Se nessun suffisso, allora è un 32 bit. Seguo la stessa cosa per Java e altri. In questo modo il mio percorso sarà più breve, senza includere "C:\Program File (x86)". Per alcuni software potrebbe essere necessario modificare il file di configurazione per mostrare dove si trova esattamente il file .exe. Solo il programma che richiede di essere installato in "C:\Program File (x86)" verrà installato in quella cartella. Ricordo sempre di accorciare i nomi. Evito i numeri di versione come Tomcat/release/version-2.5.0.3 tali dettagli. Se ho bisogno della versione conosciuta, creo un file per nome e lo metto nella cartella Tomcat. In generale accorcia il link il più possibile.

  4. Includere qualsiasi batch per sostituire il collegamento abbreviato al percorso, se tutti i passaggi precedenti hanno superato il limite di Windows.

Quindi accedere ad un utente specifico (applicazione mobile, database/data warehousing o sviluppo Web ... ..) e svolgere le attività pertinenti.

Puoi anche creare finestre virtuali all'interno di Windows. Finché si dispone di una copia del sistema operativo con licenza, è possibile creare più finestre virtuali con la stessa chiave. Puoi mettere pacchetti specifici per una particolare attività in quella macchina. Devi avviare separato VM ogni volta. Alcuni pacchetti di memoria intensiva come i film maker di animazione 3D dovrebbero essere tutti inseriti nella macchina principale, non in VM poiché VM avrà solo una parte della RAM disponibile per il suo utilizzo. Tuttavia è un problema avviare ogni VM.

0
Dr. A. Anukanth