2013-02-14 11 views
6

Ho appena controllato stackoverflow che sembrava essere molto utile e funzionava bene su Windows XP. Ma usando Windows 7 non funziona per qualche motivo oscuro.windows% PATH% variabile - come dividere su ';' nella shell CMD di nuovo

La variabile PATH assomiglia a questo

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\QuickTime\QTSystem\ 

Esso contiene ovviamente \ così come il punto e virgola che uso per dividere in un batch che contiene questo ciclo for:

FOR /F "delims=;" %%A IN ("%PATH%") DO (
     echo %%A 
    ) 

di esecuzione non causa qualsiasi errore ma fornisce solo uno (il primo) token

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common 

Non avevo idea del perché FOR terminava e giocava con diverse varianti suggerite in rete, ma nessuna ha funzionato.

Qualsiasi aiuto sarà molto apprezzato.

Christian

+0

possibile duplicato del [windows 'Pretty stampa' variabile% PATH% - come dividere il ';' nella shell CMD] (http://stackoverflow.com/questions/5471556/pretty-print-windows-path-variable-how-to-split-on-in-cmd-shell) – dbenham

+0

Hai citato una domanda duplicata che contiene un ottima risposta accettata con due soluzioni. La prima soluzione di jeb funziona nella maggior parte delle situazioni, ma può fallire. La sua seconda soluzione funziona sempre. Eppure hai deciso di provare qualcos'altro interamente. Leggi la soluzione di jeb più attentamente! Ha usato FOR, non FOR/F. – dbenham

risposta

13

Si potrebbe fare in questo modo.

for %%A in ("%path:;=";"%") do (
    echo %%~A 
) 

(Source)

Il problema con il modo in cui lo avete è che, con l'interruttore for /F, %%A specifica solo il primo token. Dovresti fare for /f "tokens=1-9 delims=;" %%A in ("%PATH%") e leggere in %%A tramite %%I in questo modo.

+0

Evviva, è tutto! Molte grazie. – Christian

+6

@Christian - Per favore [accetta la mia risposta in modo formale] (http://meta.stackexchange.com/questions/5234) se ti ha aiutato. – rojo

+0

E il problema con la possibilità di token = 1-9, è che può solo ottenere le prime varie (9) voci di percorso, e in genere ne abbiamo di più in questi giorni. Quindi la tua risposta principale (senza/F) è la cosa migliore. – William

1

cose Combinando imparato su questo e varie altre pagine StackOverflow, l'OP può essere estesa a:

Come garantire la variabile PATH ha valori univoci?

Che può essere fatto in questo modo, utilizzando le variabili di matrice:

REM usage: call :make_path_unique VARNAME "%VARNAME%" 
REM 1: splits VARNAME on ';' and builds an array of unique values (case insensitive) 
REM 2: glues the array back into a single variable 
REM 3: set the VARNAME to this newly unique-ified collection. 
REM 
REM From: various StackOverflow pages: 
REM  http://stackoverflow.com/questions/5471556/pretty-print-windows-path-variable-how-to-split-on-in-cmd-shell 
REM  http://stackoverflow.com/questions/3262287/make-an-environment-variable-survive-endlocal 
REM  http://stackoverflow.com/questions/14879105/windows-path-variable-how-to-split-on-in-cmd-shell-again 
REM 
:make_path_unique 
    setlocal EnableDelayedExpansion 
    set VNAME=%~1 
    set VPATH=%~2 
    set I=0 
    for %%A in ("%VPATH:;=";"%") do (
    set FOUND=NO 
    for /L %%B in (1,1,!I!) do (
     if /I "%%~A"=="!L[%%B]!" set FOUND=YES 
    ) 
    if NO==!FOUND! (
     set /A I+=1 
     set L[!I!]=%%~A 
    ) 
) 
    set FINAL=!L[1]! 
    for /L %%n in (2,1,!I!) do (
    set FINAL=!FINAL!;!L[%%n]! 
    set L[%%n]= 
) 
    for %%P in ("!FINAL!") do (
    endlocal 
    set %VNAME%=%%~P 
) 
    exit /b 0 

Sintesi dei passaggi:

  1. ciclo for splitting PATH a ';' e adeguatamente gestire quotazioni
    1. ciclo guardando percorsi affatto precedentemente memorizzati
    2. estendersi solo la matrice se questo è un nuovo percorso da aggiungere
  2. colla matrice pacco insieme, aprendo la variabile di matrice come andiamo
  3. sostituire il percorso e cancellare le variabili temporanee
  4. ritorno dalla funzione senza errori.

invocato, naturalmente, con:

set PATH=%PATH%;%MY_PATH_ADDITIONS% 
call :make_path_unique PATH "%PATH%" 
+0

Grazie, @LotPings, per la modifica. il paragone senza casato è migliore e setlocal/endlocal è più pulito. –

Problemi correlati