2013-02-14 2 views
6

Я только что проверил stackoverflow, который казался очень полезным и отлично работал в Windows XP. Но с использованием Windows 7 он не работает по какой-то неясной причине.windows% PATH% variable - как разделить на ';' в CMD shell снова

Переменная PATH выглядит следующим образом

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\ 

Это, очевидно, содержит \ а также точка с запятой, которые я использую для разделения в пакете, содержащем этот FOR-петли:

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

Выполнение не делает причины любая ошибка, но она обеспечивает только один (первый) токен

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

Я понятия не имел, почему FOR завершает и играет с несколькими вариантами, которые были предложены в сети, но никто не выполнял эту работу.

Любая помощь будет высоко оценена.

Christian

+0

возможно дубликат [ 'Довольно печать' окна% PATH переменной% - как разделить на ';' в оболочке CMD] (http://stackoverflow.com/questions/5471556/pretty-print-windows-path-variable-how-to-split-on-in-cmd-shell) – dbenham

+0

Вы указали дублирующий вопрос, который содержит большой принятый ответ с двумя решениями. Первое решение jeb работает в большинстве ситуаций, но может потерпеть неудачу. Его второе решение всегда работает. Но вы решили попробовать что-то еще. Внимательно прочитайте решение jeb! Он использовал FOR, а не FOR/F. – dbenham

ответ

13

Вы могли бы сделать это таким образом.

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

(Source)

Проблема с тем, как у вас есть это то, что, используя переключатель for /F, %%A определяет только первый маркер. Вам нужно было бы сделать for /f "tokens=1-9 delims=;" %%A in ("%PATH%") и читать в %%A через %%I таким образом.

+0

Ура, вот и все! Большое спасибо. – Christian

+6

@Christian - Пожалуйста, [принимайте мой ответ формально] (http://meta.stackexchange.com/questions/5234), если он вам помог. – rojo

+0

И проблема с возможностями tokens = 1-9 состоит в том, что он может получить только первые несколько записей пути (9), и мы обычно имеем больше, чем в наши дни. Поэтому ваш главный ответ (без/F) - лучшая вещь. – William

1

Комбинирования вещи узнала об этом и различных других страницах StackOverflow, ОП может быть продлены до:

Как обеспечить переменную PATH имеют уникальные значения?

Что может быть сделано таким образом, с помощью переменных массива:

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 

Резюме шагов:

  1. для контура расщепления PATH в ';' и надлежащее управление котировкой
    1. цикла, глядя на все ранее сохраненных пути
    2. только расширить массив, если это новый путь будет добавлен
  2. клея массива пакета вместе, очищая переменный массив, как мы идем
  3. заменить путь и очистить временные переменные
  4. возврат из функции без ошибок.

вызван, конечно, с:

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

Спасибо, @LotPings, для редактирования. сравнение без лишних бит лучше, а setlocal/endlocal - более чистый. –

Смежные вопросы