ECHO %PATH% 在 Windows 中显示路径的顺序是否错误?

ECHO %PATH% 在 Windows 中显示路径的顺序是否错误?

我目前正在与 Windows 7 上的 IDE 和 PATH、JAVE_HOME 等的使用作斗争。

正如这个问题所述:PATH 变量显示不同的值(命令提示符与环境变量对话框)不幸的是,我使用 在用户目录中复制了我的整个 PATH(多次)setx

但有一点我不明白:如果我执行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。使用时 Windows 读取的第一个文件夹java -version是用户路径中的第一个文件夹,而不是全局路径中的第一个文件夹。但是当打印完整路径时,显示的第一个带有 java 可执行文件的文件夹是 jdk 1.7.0...

那么,Windows 是否会回应这样的路径:系统第一,用户第二,但是却使用用户第一,系统第二?

答案1

很久以前(echo %path:;=&echo.%那时我还不知道这个技巧),我写了下面的bat脚本。它可以帮助查找 PATHPATHEXT变量中可能存在的不一致(以及它们的注册表来源)。

用法

  • TestPath.bat        - 主要表现口是心非PATHPATHEXT变量中,
  • TestPath.bat dir     - 列表数字可执行文件在文件夹内PATH
  • TestPath.bat dir all- 列表名称可执行文件文件夹内PATH

剧本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

相关内容