![ECHO %PATH% 在 Windows 中显示路径的顺序是否错误?](https://linux22.com/image/1616538/ECHO%20%25PATH%25%20%E5%9C%A8%20Windows%20%E4%B8%AD%E6%98%BE%E7%A4%BA%E8%B7%AF%E5%BE%84%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%98%AF%E5%90%A6%E9%94%99%E8%AF%AF%EF%BC%9F.png)
我目前正在与 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
脚本。它可以帮助查找 PATH
和PATHEXT
变量中可能存在的不一致(以及它们的注册表来源)。
用法:
TestPath.bat
- 主要表现口是心非在PATH
和PATHEXT
变量中,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