2013-02-14 11 views
6

Ich habe gerade überprüft stackoverflow, die sehr hilfreich zu sein schien und funktionierte gut auf Windows XP. Aber mit Windows 7 funktioniert es aus irgendeinem obskuren Grund nicht.Windows% PATH% Variable - wie auf ';' in CMD Shell wieder

Die PATH Variable wie folgt aussieht

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\ 

Es enthält offensichtlich \ sowie Semikolons ich in einer Charge spalten verwenden, der diese FOR-Schleife enthält:

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

Ausführen nicht Ursache jeder Fehler, aber es bietet nur eine (die erste) Token

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

Ich hatte keine Ahnung, warum FOR mit verschiedenen Varianten, die im Netz vorgeschlagen wurden, abbrach und mit ihnen herumspielte, aber keiner hat es geschafft.

Jede Hilfe wird sehr geschätzt.

Christian

+0

möglich Duplikat [ 'Pretty print' windows% PATH% Variable - wie aufzuspalten auf ';' in CMD-Shell] (http://stackoverflow.com/questions/5471556/pretty-print-windows-path-variable-how-to-split-on-in-in-cmd-shell) – dbenham

+0

Sie zitiert eine doppelte Frage, die ein enthält große akzeptierte Antwort mit zwei Lösungen. Jebs erste Lösung funktioniert in den meisten Situationen, kann aber scheitern. Seine zweite Lösung funktioniert immer. Trotzdem hast du entschieden, etwas ganz anderes zu probieren. Lies jebs Lösung genauer! Er benutzte FOR, nicht FOR/F. – dbenham

Antwort

13

Sie könnten es so machen.

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

(Source)

Das Problem mit der Art und Weise haben Sie es ist, dass mit dem for /F Schalter, %%A nur das erste Token angibt. Sie müssten for /f "tokens=1-9 delims=;" %%A in ("%PATH%") tun und %%A über %%I auf diese Weise einlesen.

+0

Hurra, das war's! Danke vielmals. – Christian

+6

@Christian - Bitte [akzeptieren Sie meine Antwort formell] (http://meta.stackexchange.com/questions/5234), wenn es Ihnen geholfen hat. – rojo

+0

Und das Problem mit den Tokens = 1-9 Möglichkeit, ist, dass es nur die ersten mehrere (9) Pfadeinträge bekommen kann, und wir haben typischerweise mehr als das in diesen Tagen. Also deine Hauptantwort (ohne das/F) ist das Beste. – William

1

Kombination Dinge auf diesem und verschiedenen anderen Seiten gelernt Stackoverflow, kann die OP zu erweitern:

Wie das PATH-Variable eindeutige Werte hat zu gewährleisten?

die diese Art und Weise durchgeführt werden kann, unter Verwendung von Feldvariablen:

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 

Zusammenfassung der Schritte:

  1. for-Schleife Aufspalten PATH bei ';' und eine ordnungsgemäße Anführungszeichen
    1. for-Schleife an allen suchen vorher gespeicherten Pfaden
    2. nur das Array erstrecken, wenn dies ein neuer Weg
  2. das Array Packung zusammenkleben hinzugefügt werden, das Löschen der Array-Variablen als wir gehen
  3. ersetzen Sie den Pfad und löschen Sie die temporären Variablen
  4. Rückkehr von der Funktion ohne Fehler.

aufgerufen, natürlich, mit:

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

Danke, @LotPings, für die Bearbeitung. caseless compare ist besser, und setlocal/endlocal ist sauberer. –