我刚刚检查了stackoverflow,它似乎非常有用,在Windows XP上运行良好。但使用Windows7,由于一些不明确的原因,它不起作用。
PATH
变量看起来像这个
C:Program Files (x86)NVIDIA CorporationPhysXCommon;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program Files (x86)QuickTimeQTSystem
它显然包含\以及我用来在包含以下FOR循环的批中拆分的分号:
FOR /F "delims=;" %%A IN ("%PATH%") DO (
echo %%A
)
执行不会导致任何错误,但它只提供一个(第一个)令牌
C:Program Files (x86)NVIDIA CorporationPhysXCommon
我不知道为什么FOR会终止比赛,并在网上提出了一些变体,但都没有起到作用。
如有任何帮助,我们将不胜感激。
Christian
您可以这样做。
for %%A in ("%path:;=";"%") do (
echo %%~A
)
(来源)
这种方式的问题在于,使用for /F
开关,%%A
只指定第一个令牌。你必须做for /f "tokens=1-9 delims=;" %%A in ("%PATH%")
,并以这种方式在%%A
到%%I
中阅读。
结合在这个页面和其他各种堆叠页面上学到的东西,OP可以扩展到:
如何确保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
步骤摘要:
- 用于在";"处拆分PATH的循环以及正确管理报价
- for循环查找以前存储的所有路径
- 仅当这是要添加的新路径时才扩展数组
- 将数组包粘合在一起,在执行过程中清除数组变量
- 替换路径并清除临时变量
- 从函数返回,没有任何错误
当然,调用时使用:
set PATH=%PATH%;%MY_PATH_ADDITIONS%
call :make_path_unique PATH "%PATH%"