9

我刚刚检查了似乎很有帮助并且在 Windows XP 上运行良好的stackoverflow 。但使用 Windows 7 时,由于某些不明原因,它不起作用。

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 终止并尝试了一些在网上建议的变体,但没有一个能奏效。

任何帮助将不胜感激。

基督教

4

2 回答 2

22

你可以这样做。

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

来源

您拥有它的方式的问题在于,使用for /F开关 %%A仅指定第一个令牌。你必须这样做for /f "tokens=1-9 delims=;" %%A in ("%PATH%")%%A通过%%I这种方式阅读。

于 2013-02-14T16:23:50.347 回答
2

结合在此页面和其他各种 stackoverflow 页面上学到的东西,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

步骤总结:

  1. for循环在';'处拆分PATH 并妥善管理报价
    1. for 循环查看所有先前存储的路径
    2. 如果这是要添加的新路径,则仅扩展数组
  2. 将数组包粘合在一起,边走边清除数组变量
  3. 替换路径并清除临时变量
  4. 从函数返回,没有错误。

调用,当然,与:

set PATH=%PATH%;%MY_PATH_ADDITIONS%
call :make_path_unique PATH "%PATH%"
于 2016-10-19T16:09:38.693 回答