9

非常に役立つと思われるstackoverflowをチェックしたところ、Windows XPで問題なく動作しました。しかし、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
   )

実行してもエラーは発生しませんが、1 つの (最初の) トークンのみが提供されます

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

このページと他のさまざまなスタックオーバーフロー ページで学んだことを組み合わせて、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 at ';' 見積もりの​​適切な管理
    1. 以前に保存されたすべてのパスを調べる for ループ
    2. これが追加される新しいパスである場合にのみ配列を拡張します
  2. 配列パックを一緒に接着し、進むにつれて配列変数をクリアします
  3. パスを置き換え、一時変数をクリアします
  4. エラーなしで関数から戻ります。

もちろん、次のように呼び出します。

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