嘟嘟社区

[疑问] 辛辛苦苦写了批处理,还是不能刷新到系统


本意是为了快速设置java环境,wmic还是不能刷新系统,看样子只能使用
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(PChar(‘Environment’)), SMTO_NORMAL, 4000, ret)
非要编译喽

大神有啥办法,通过脚本刷新?

  1. [url=home.php?mod=space&uid=20206]@echo[/url] off
  2. REM dyydyyBatchFile
  3. REM 获得当前文件的目录
  4. setlocal enabledelayedexpansion
  5. cls
  6. echo =————————=
  7. set CDIR=%~dp0
  8. set CDIR="C:jdk1.8"
  9. goto :MAIN
  10. :: 函数定义
  11. :getWmicVar
  12.     :: %1=name,%2=username
  13.     set xname=%1
  14.     set xname=!xname:"=!
  15.     echo %2 | findstr "system" >nul && (
  16.         set uname=^<system^>
  17.         ) || (
  18.             set uname=%2
  19.             set uname=!uname:"=!
  20.         )
  21.     set cmd=wmic ENVIRONMENT where "name=’%xname%’ and username=’%uname%’" get VariableValue
  22.     set ret=
  23.     ::下面的执行结果有多行,就会执行多次 %%a会轮换
  24.     set/a i=0
  25.     for /f "delims=" %%a in (‘%cmd%’) do (
  26.         ::跳过第行标头 第1行
  27.         if !i! equ 1 (
  28.             set ret=%%a
  29.         )      
  30.         set /a i=i+1
  31.     )
  32.     :: 返回的变量有尾随空格,处理掉
  33.     :: 最后一个可能是回车,删除一个char,果然
  34.     set ret=!ret:~0,-1!
  35.     :innerLoop
  36.     if "!ret:~-1!"==" " (
  37.         set ret=!ret:~0,-1!
  38.         goto :innerLoop
  39.     )
  40. goto :EOF
  41. :setWmicVar
  42.     :: %1=name,%2=value,%3=username 第二个参数为空时仅删除这个环境变量
  43.     set xname=%1
  44.     set xname=!xname:"=!
  45.     set xvalue=%2
  46.     set xvalue=!xvalue:"=!
  47.     echo %3 | findstr "system" >nul && (
  48.         set uname=^<system^>
  49.         ) || (
  50.             set uname=%3
  51.             set uname=!uname:"=!
  52.         )
  53.     wmic ENVIRONMENT where "name=’%xname%’ and username=’%uname%’" delete
  54.     if not "%xvalue%"=="" (
  55.         wmic ENVIRONMENT create name="%xname%" , username="%uname%" , VariableValue="%xvalue%"
  56.     )   
  57.     set ret=%errorlevel%
  58. goto :EOF
  59. [url=home.php?mod=space&uid=55828]@rem[/url] ————————下面是主入口———————————
  60. :MAIN
  61. set tousr=
  62. set cusr=
  63. set /p tousr="绿化安装到当前用户还是整个系统(默认为安装到当用用户环境):"
  64. if "%tousr%"=="" (
  65.     for /f %%a in (‘whoami’) do set cusr=%%a
  66.     set cusr=!cusr:=\!
  67. ) else (
  68.     :: <system>作为参数传不过去,因为有特殊字符<>
  69.     set cusr="system"
  70. )
  71. :: 读取指定用户的path环境变量
  72. call :getWmicVar "path" "%cusr%"
  73. set pth=%ret%
  74. if "%pth%"=="" goto :EOF
  75. set newPath=
  76. :loop1
  77. for /f "tokens=1,* delims=;" %%a in ("%pth%") do (
  78.     set apth=%%a
  79.     set pth=%%b
  80. )
  81. @REM 卸载 ,并清除了无效路径
  82. if not "%apth:~0,11%"=="%%JAVA_HOME%%" if exist %apth%  (
  83.        set newPath=%newPath%%apth%;
  84.     )
  85. if defined pth goto :loop1
  86. call :getWmicVar "JAVA_HOME" "%cusr%"
  87. set javahomefind=%ret%
  88. if "%javahomefind%" == "" (
  89.     :: 安装
  90.     call :setWmicVar "JAVA_HOME" "%CDIR%" "%cusr%"
  91.     :: 下面的 %%JAVA_HOME%% 经过传递给子过程,被脱掉了一层%,所以还需要再加一层
  92.     call :setWmicVar "CLASSPATH" ".;%%%%JAVA_HOME%%%%libdt.jar;%%%%JAVA_HOME%%%%libtools.jar;" "%cusr%"
  93.     call :setWmicVar "path" "%newPath%;%%%%JAVA_HOME%%%%bin;%%%%JAVA_HOME%%%%jrebin" "%cusr%"
  94.     echo "JAVA环境 设置完毕"
  95. ) else (
  96.     :: 卸载
  97.     call :setWmicVar "JAVA_HOME" "" "%cusr%"
  98.     call :setWmicVar "CLASSPATH" "" "%cusr%"
  99.     call :setWmicVar "path" "%newPath%" "%cusr%"
  100.     echo "JAVA_HOME 卸载完毕"
  101. )
  102. pause

复制代码

本帖最后由 sRGB 于 2021-12-6 10:30 编辑

java 语法太啰嗦,看java代码就想睡觉

把 JRE 部署到Docker 容器中,使用 Docker 管理停止启动会简单点吧

现在要PowerShell