私は現在、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はパスをエコーしますか:システムファースト、ユーザーセカンドですが、ユーザーファースト、システムセカンドを使用しますか?
ずっと前に(当時は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