2013-02-14 77 views
6

我剛剛檢查stackoverflow這似乎是非常有用的,並在Windows XP上工作正常。但使用Windows 7並不適用於某些不明原因。windows%PATH%變量 - 如何拆分';'在CMD外殼再次

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會終止並在網絡上提出幾個變體,但沒有任何工作。

任何幫助將不勝感激。

基督教

+0

[ '漂亮打印' 窗口%PATH%變量的可能重複的 - 如何分割上 ';'在CMD殼](http://stackoverflow.com/questions/5471556/pretty-print-windows-path-variable-how-to-split-on-in-cmd-shell) – dbenham 2013-02-15 15:49:57

+0

你引用了一個重複的問題,其中包含有兩種解決方案的最佳答案。 jeb的第一個解決方案在大多數情況下都可以工作,但可能會失敗他的第二個解決方案總是可行然而,你選擇完全嘗試其他的東西。更仔細地閱讀jeb的解決方案!他用FOR,而不是FOR/F。 – dbenham 2013-02-15 15:52:48

回答

13

你可以這樣做。

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

Source

與你擁有它的是,使用for /F開關,%%A僅指定第一個令牌的方式的問題。你必須做for /f "tokens=1-9 delims=;" %%A in ("%PATH%")並通過%%I這樣讀%%A

+0

萬歲,就是這樣!非常感謝。 – Christian 2013-02-14 17:13:41

+6

@Christian - 請[正式接受我的回答](http://meta.stackexchange.com/questions/5234)如果它幫助了你。 – rojo 2013-02-14 19:41:43

+0

而令牌= 1-9的可能性問題是,它只能得到前幾個(9)路徑條目,而我們通常比這些日期多。所以你的主要答案(沒有/ F)是最好的。 – William 2016-03-28 16:10:22

1

結合東西就這個問題和其他各種計算器的頁面瞭解到,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. 在環分割PATH ';'和正確管理引號
    1. for循環尋找所有先前存儲的路徑
    2. 只有當這是要被添加
  2. 膠陣列包一起,清除數組變量作爲一個新的路徑延伸的陣列我們去
  3. 替換路徑並清除臨時變量
  4. 從函數返回而沒有錯誤。

調用,當然,具有:

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

感謝@LotPings的編輯。無情的比較更好,並且setlocal/endlocal更清潔。 – 2016-12-05 01:01:59