web-dev-qa-db-ja.com

ECHO%PATH%は、Windowsでパスを間違った順序で表示しますか?

私は現在、Windows 7でのIDEおよびPATH、JAVE_HOMEなどの使用法と戦っています。

この質問で述べたように: 異なる値を示すPATH変数(コマンドプロンプトと環境変数ダイアログボックス) 残念ながら、setxを使用してユーザーのPATH全体を(複数回)コピーしました。

しかし、私には理解できないことがあります。_echo %PATH%_を実行すると、ユーザーの前にシステムパスが出力されるようです。ただし、パスを使用する場合、Windowsは最初にユーザーを検索し、次にシステムを検索するようです。

デフォルトのJDKをオーバーライドしようとしているので、これを求めています。

例、_echo %path:;=&echo.%_(キャリッジリターンでパスを出力するため)を実行する場合

_C:\Program Files (x86)\Java\jdk1.7.0_07\bin
c:\program files\Apache-maven-3.5.0\bin 
C:\Program Files (x86)\Java\jdk1.7.0_07\bin 
c:\program files\Apache-maven-3.5.0\bin
C:\Program Files (x86)\Java\jdk1.7.0_07\bin
c:\program files\Apache-maven-3.5.0\bin
C:\WINDOWS\System32
C:\ProgramData\Oracle\Java\javapath
C:\WINDOWS\system32 
C:\WINDOWS 
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\

etc.

C:\Users\asoub\Java\open_jdk_8u40\bin 
C:\Program Files (x86)\Java\jdk1.7.0_07\bin 
c:\program files\Apache-maven-3.5.0\bin
C:\Program Files (x86)\Java\jdk1.7.0_07\bin 
c:\program files\Apache-maven-3.5.0\bin 
C:\Program Files (x86)\Java\jdk1.7.0_07\bin 
c:\program files\Apache-maven-3.5.0\bin
C:\WINDOWS\System32
C:\ProgramData\Oracle\Java\javapath
C:\WINDOWS\system32 
C:\WINDOWS 
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
_

しかし、_Java -version_を実行すると、_openjdk version "1.8.0_40"_が得られます。そしてこれを確認するために、C:\Users\asoub>For /F "Skip=2Tokens=1-2*" %A In ('Reg Query HKCU\Environment /V PATH 2^>Nul') Do @Echo %A=%Cでユーザーパスのみを出力すると

_PATH=C:\Users\asoub\Java\open_jdk_8u40\bin
C:\Program Files(x86)\Java\jdk1.7. 0_07\bin
c:\program files\Apache-maven-3.5.0\bin
C:\Program Files (x86)\Java\jdk1.7.0_07\bin
c:\program files\Apache-maven-3.5.0\bin
C:\Program Files (x86)\Java \jdk1.7.0_07\bin
c:\program files\Apache-maven-3.5.0\bin
C:\WINDOWS\System32
C:\ProgramData\Oracle\Java\javapath
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\Program Files\SafeNet\Aut
_

Javaバイナリファイルはもちろん_Java\...\bin_にあります。_Java -version_を使用するときにWindowsによって読み取られる最初のフォルダーは、ユーザーパスの最初のフォルダーであり、グローバルパス。ただし、フルパスが出力されると、Java実行可能ファイルが表示される最初のフォルダーはjdk1.7.0 .. ..

それで、Windowsはパスをエコーし​​ますか:システムファースト、ユーザーセカンドですが、ユーザーファースト、システムセカンドを使用しますか?

1
Asoub

ずっと前に(当時はecho %path:;=&echo.%のトリックを知りませんでした)、次のbatスクリプトを作成しました。 PATH変数とPATHEXT変数(およびそれらのレジストリOrigin)で発生する可能性のある不整合を見つけるのに役立つ可能性があります。

使用法

  • TestPath.bat        -主にPATH変数とPATHEXT変数の重複を示します。
  • TestPath.bat dir    -PATH内のフォルダ内の実行可能ファイルnumberを一覧表示します、
  • TestPath.bat dir all-PATH内のフォルダー内の実行可能ファイルnamesを一覧表示します。

TestPath.batスクリプト:

@ECHO OFF
set "HkcuEnv=HKCU\Environment"
set "HklmEnv=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
REM set hk
SETLOCAL enableextensions enabledelayedexpansion
echo --- %date% %time% %~nx0 %*  

if /I "%~1" EQU "dir" (
    set path
    Call :printPath path "" dir %~2
    echo/
    echo tested using the following findstr regex: 
    echo "%pathext:;=$ %$"
    ENDLOCAL
    goto :eof
)

set pathext

Call :duplicity pathext

Call :printPath path ""

Call :duplicity path

set "HKCU_type="
set "HKCU_path="
for /F "tokens=2*" %%G in (
  'reg query HKCU\Environment /v Path 2^>NUL ^|findstr /I "path"'
  ) do (
    set "HKCU_type=%%G"
    set "HKCU_path=%%H"
  ) 
Call :printPath HKCU_path %HKCU_type%
if /I "%HKCU_type%"=="REG_EXPAND_SZ" Call :printPath HKCU_path %HKCU_type% Expanded

set "HKLM_type="
set "HKLM_path="
set "qqqq=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
for /F "tokens=2*" %%G in ('reg query "%qqqq%" /v Path^|findstr /I "path"'
  ) do (
    set "HKLM_type=%%G" 
    set "HKLM_path=%%H" 
  ) 
Call :printPath HKLM_path %HKLM_type%
if /I "%HKLM_type%"=="REG_EXPAND_SZ" Call :printPath HKLM_path %HKLM_type% Expanded

echo/
pause
REM echo/
REM set HK
echo/
echo/Usage: %~nx0
echo/       %~nx0 dir
echo/       %~nx0 dir all
ENDLOCAL
goto :eof

:printPath
echo/
echo %~0 %~1 %~2 %~3 %~4
if "!%~1!" NEQ "" (
  set "ggg="!%~1:;=" "!""
  rem set "ggg=!ggg:\"="!"
  for %%G in (!ggg!) do (
    if /I "%~3" NEQ "expanded" (
        if /I "%~3" EQU "dir" (
            set "_partpath=%%~G"
            if not "%~4"=="" ( 
                echo/
                echo "%%~G"
                if /I "!_partpath:%SystemRoot%=!" EQU "%%~G" (
                    dir /B /A:-D "%%~G" | findstr /I "%pathext:;=$ %$"
                    echo errorlevel !errorlevel!
                    if errorlevel 1 pause
                    rem timeout /T 3 /NOBREAK >NUL
                ) else (
                    >NUL (dir /B /A:-D "%%~G" | findstr /I "%pathext:;=$ %$")
                    echo errorlevel !errorlevel!                system default
                    if errorlevel 1 pause
                )
            ) else (
                if NOT "%%~G"=="" (
                    for /F %%g in ('
                      2^>NUL dir /B /A:-D "%%~G" ^| findstr /I "%pathext:;=$ %$" ^| find "." /C
                    ') do echo "%%~G" %%g file(s^)
                ) else (
                    echo "%%~G" ? file(s^)
                )
            )
        ) else (
            echo "%%~G"
        ) 
    ) else (
        call echo "%%~G"
    )
  )
)
goto :eof

:duplicity
echo/
echo %~0 %~1 %~2
set /A "ii=0"
set "ggg="!%~1:;=" "!""
set "ggg=!ggg:\"="!"
for %%G in (!ggg!) do (
  set /A "ii+=1"
  set /A "jj=0"
  for %%g in (!ggg!) do (
    set /A "jj+=1"
    if /I "%%~G"=="%%~g" if !ii! LSS !jj! echo !ii!, !jj!: %%~g 
  )
)
goto :eof
1
JosefZ