diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd98e77 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +WinEnv.old diff --git a/History.md b/History.md new file mode 100644 index 0000000..1aa2e4c --- /dev/null +++ b/History.md @@ -0,0 +1,5 @@ +# 更新历史 + +## 0.1.0 / 2023-12-22 + +- 初始版本 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..63bc1a9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 FB + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..5c208c7 --- /dev/null +++ b/Readme.md @@ -0,0 +1,105 @@ +# 运行环境设置 + +批量添加 Windows 环境变量的工具. + +根据配置文件的内容, 对 Windows 环境变量进行设置. + +支持头部插入, 支持结尾追加, 支持`%`变量. + +## 配置文件 + +默认配置文件名与脚本同名但扩展名不同, 配置文件扩展名`.ini`, 备份文件扩展名`.old`. + +非标准 INI 格式, 提供作用域和环境变量等配置. + +### 格式 + +- 注释行(comment) + + 以`#`开头的行. + +- 无效行(invalid) + + 不含`=` 或者 值为空. + +- 段(section) + + 以`[]`包裹的行. + +- 键(key) + + 行第一个`=`左边的字符串. + +- 值(value) + + 行第一个`=`右边的字符串. + +### 内容 + +- 作用域(SCOPE) + + 段外键值, 键`SCOPE`, 可选值`MACHINE`或者`USER`, 默认值`USER`. 明确定义作用域范围, `MACHINE`为全局, `USER`为用户. + +- 替换(REPLACE) + + 段名`REPLACE`, 段内定义多个键值. 键为环境变量名称, 值为环境变量内容. 值会替换环境变量, 可以使用`(Removed)`占位符表示删除环境变量. + +- 追加(APPEND) + + 段名`APPEND`, 段内定义多个键值. 键为环境变量名称, 值为环境变量内容. 值会追加到环境变量后. + +- 插入(INSERT) + + 段名`INSERT`, 段内定义多个键值. 键为环境变量名称, 值为环境变量内容. 值会插入到环境变量前. + +- 变量和转义 + + 配置文件中`%`包裹的变量, 在执行时会被展开. 需要保留`%`时, 用`%%`方式进行转义. + +### 示例 + +```ini +SCOPE=USER + +[REPLACE] +JAVA_HOME=%CD%\JDK11 + +[APPEND] +PATH=;%%JAVA_HOME%%\Bin +``` + +```ini +SCOPE=MACHINE + +[REPLACE] +POWERSHELL_HOME=%CD%\POWERSHELL7 + +[INSERT] +PATH=%%POWERSHELL_HOME%%; +``` + +## 命令行: + +命令行: WinEnv.cmd [配置文件[.ini]] [/o|-o <1|2|3>] [/h|-h] + +- 配置文件 + + 指定配置文件路径, 可以省略`.ini`. 备份文件会根据配置文件名生成, 扩展名为`.old`. 默认配置文件`WinEnv.ini`, 默认备份文件`WinEnv.old`. + +- `/o` | `-o` + + 指定要执行的操作. 必选参数, `1`设置环境变量, `2`恢复环境变量, `3`退出. 默认为等待用户选择. + +- `/h` | `-h` + + 显示帮助 + +### 示例 + +```bat +Env.cmd +Env.cmd XXX +Env.cmd XXX.ini +Env.cmd XXX /o 1 +Env.cmd XXX.ini /o 2 +``` diff --git a/Script/Array.Clear.CMD b/Script/Array.Clear.CMD new file mode 100644 index 0000000..f81cd5b --- /dev/null +++ b/Script/Array.Clear.CMD @@ -0,0 +1,14 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ + +::Script:Array.Destroy.CMD:: +::Script:Array.New.CMD:: + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +CALL Array.Destroy.CMD "%~1" +CALL Array.New.CMD "%~1" +EXIT /B diff --git a/Script/Array.Destroy.CMD b/Script/Array.Destroy.CMD new file mode 100644 index 0000000..3cfc8ad --- /dev/null +++ b/Script/Array.Destroy.CMD @@ -0,0 +1,14 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +CALL SET "@=%%%~1.@ARRAY%%" +FOR /L %%A IN (0,1,%@%) DO ( + SET "%~1.%%~A=" +) +SET "%~1.@ARRAY=" +EXIT /B diff --git a/Script/Array.New.CMD b/Script/Array.New.CMD new file mode 100644 index 0000000..59caef7 --- /dev/null +++ b/Script/Array.New.CMD @@ -0,0 +1,18 @@ +::@author FB +::@version 0.1.0 + +::֯: A.1=* A.2=* A.3=* +::ݳ: %A.@ARRAY% +::ݴ: CALL Array.New.CMD A; +::: CALL Array_Push.CMD A "*"; +::ݷ: CALL Array_Get.CMD A 1; CALL :ARRAY_POP A 2; +::ݱ: CALL Array_List.CMD A "ECHO {0} {1}"; +::: CALL Array_Destroy.CMD A; + +:: +:: 1: ʵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET /A "%~1.@ARRAY=0" +EXIT /B diff --git a/Script/Array.Push.CMD b/Script/Array.Push.CMD new file mode 100644 index 0000000..e80522b --- /dev/null +++ b/Script/Array.Push.CMD @@ -0,0 +1,12 @@ +::@author FB +::@version 0.1.0 + +::ѹ +:: 1: ʵ +:: 2: Ԫ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +SET "@=%~2" +CALL SET "%~1.%%%~1.@ARRAY%%=%%@%%" +SET /A "%~1.@ARRAY+=1" +EXIT /B diff --git a/Script/Config.ArgParser.CMD b/Script/Config.ArgParser.CMD new file mode 100644 index 0000000..3052550 --- /dev/null +++ b/Script/Config.ArgParser.CMD @@ -0,0 +1,35 @@ +::@author FB +::@version 0.1.0 + +::: ʵ.PARAM, ΪArray +::ѡ: ʵ.OPTION, ΪMap + +:: +:: 1: ʵ +:: N: + +::Script:Array.Clear.CMD:: +::Script:Array.Push.CMD:: +::Script:Map.Clear.CMD:: +::Script:Map.Put.CMD:: + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET "@VAR=%~1" +CALL Array.Clear.CMD "%@VAR%.PARAM" +CALL Map.Clear.CMD "%@VAR%.OPTION" +:_ARG_PARSE_LOOP +SHIFT +IF "%1" == "" (SET "@=" & SET "@VAR=" & EXIT /B) +SET "@=%~1" +ECHO.%@% | FINDSTR "^[-/]" 1>NUL 2>&1 && ( + ECHO.%~2 | FINDSTR /R /C:"^[-/]" /C:"^[ ]*$" 1>NUL 2>&1 && ( + CALL Map.Put.CMD "%@VAR%.OPTION" "%%@:~1%%" "TRUE" + ) || ( + CALL Map.Put.CMD "%@VAR%.OPTION" "%%@:~1%%" "%~2" + SHIFT + ) +) || ( + CALL Array.Push.CMD "%@VAR%.PARAM" "%%@%%" +) +GOTO :_ARG_PARSE_LOOP diff --git a/Script/Config.FileRead.CMD b/Script/Config.FileRead.CMD new file mode 100644 index 0000000..09aeaf2 --- /dev/null +++ b/Script/Config.FileRead.CMD @@ -0,0 +1,39 @@ +::@author FB +::@version 0.1.1 + +::ݽṹΪObject +::֧һ +::%ıᱻչ + +::KEY#ͷ,ʲôҲ +::VALUEΪ,浽 +::KEY[],лǰ + +::ȡļ +:: 1: ʵ +:: 2: ļ + +::Script:String.Trim.CMD:: + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET "@VAR=%~1" & SET "@SECTION=." +FOR /F "eol=# tokens=1,* usebackq delims==" %%A IN ( + `TYPE "%~2" 2^>NUL` +) DO ( + SET "@KEY=%%~A" + SET "@VALUE=%%~B" + CALL String.Trim.CMD "%%@KEY%%" & CALL SET "@KEY=%%@%%" + CALL String.Trim.CMD "%%@VALUE%%" & CALL SET "@VALUE=%%@%%" + CALL :_PARSE_LINE +) +SET "@VALUE=" & SET "@KEY=" & SET "@SECTION=" & SET "@VAR=" +EXIT /B + +:_PARSE_LINE +IF NOT "%@KEY:~,1%" == "#" IF NOT "%@VALUE%" == "" ( + SET "%@VAR%%@SECTION%%@KEY%=%@VALUE%" +) ELSE IF "%@KEY:~,1%" == "[" IF "%@KEY:~-1%" == "]" ( + SET "@SECTION=.%@KEY:~1,-1%." +) +GOTO :EOF diff --git a/Script/Config.FileWrite.CMD b/Script/Config.FileWrite.CMD new file mode 100644 index 0000000..a114ece --- /dev/null +++ b/Script/Config.FileWrite.CMD @@ -0,0 +1,26 @@ +::@author FB +::@version 0.1.0 + +::ݽṹΪObject +::֧һ + +::дļ +:: 1: ʵ +:: 2: ļ + +::Script:Object.List.CMD:: +::Script:Object.ListSub.CMD:: +::Script:Object.ListAll.CMD:: + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +ECHO # This is an autogenerated file. Do not edit this file directly.>"%~2" +CALL Object.List.CMD "%~1" "{0}={1}">>"%~2" +FOR /F "usebackq delims=" %%A IN ( + `CALL Object.ListSub.CMD "%~1" "{0}"` +) DO ( + ECHO.>>"%~2" + CALL ECHO [%%~A]>>"%~2" + CALL Object.ListAll.CMD "%~1.%%~A" "{0}={1}">>"%~2" +) +EXIT /B diff --git a/Script/Map.Clear.CMD b/Script/Map.Clear.CMD new file mode 100644 index 0000000..e8862a0 --- /dev/null +++ b/Script/Map.Clear.CMD @@ -0,0 +1,14 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ + +::Script:Map.Destroy.CMD:: +::Script:Map.New.CMD:: + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +CALL Map.Destroy.CMD "%~1" +CALL Map.New.CMD "%~1" +EXIT /B diff --git a/Script/Map.Destroy.CMD b/Script/Map.Destroy.CMD new file mode 100644 index 0000000..d4ef028 --- /dev/null +++ b/Script/Map.Destroy.CMD @@ -0,0 +1,14 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +CALL SET "@=%%%~1.@MAP%%" +FOR %%A IN (%@%) DO ( + SET "%~1.%%~A=" +) +SET "%~1.@MAP=" +EXIT /B diff --git a/Script/Map.New.CMD b/Script/Map.New.CMD new file mode 100644 index 0000000..10be62d --- /dev/null +++ b/Script/Map.New.CMD @@ -0,0 +1,18 @@ +::@author FB +::@version 0.1.0 + +::֯: A.XX=* A.YY=* A.ZZ=* +::б: %A.@MAP% +::ݴ: CALL Map_New.CMD A; +::: CALL Map_Push.CMD A XX "*"; +::ݷ: CALL Map_Get.CMD A XX; CALL :ARRAY_REMOVE A YY; +::ݱ: CALL Map_List.CMD A "ECHO {0} {1}"; +::: CALL Map_Destroy.CMD A; + +:: +:: 1: ʵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET "%~1.@MAP=;" +EXIT /B diff --git a/Script/Map.Put.CMD b/Script/Map.Put.CMD new file mode 100644 index 0000000..4fc06c2 --- /dev/null +++ b/Script/Map.Put.CMD @@ -0,0 +1,14 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ +:: 2: +:: 3: ֵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET "@=%~3" & CALL SET "%~1.%~2=%%@%%" +CALL ECHO.%%%~1.@MAP%% | FIND /I ";%~2;" 1>NUL 2>&1 ^ + || CALL SET "%~1.@MAP=%%%~1.@MAP%%%~2;" +EXIT /B diff --git a/Script/Object.Destroy.CMD b/Script/Object.Destroy.CMD new file mode 100644 index 0000000..a58af85 --- /dev/null +++ b/Script/Object.Destroy.CMD @@ -0,0 +1,12 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +FOR /F "tokens=1,* usebackq delims==" %%A IN (`SET "%~1." 2^>NUL`) DO ( + SET "%%~A=" +) +EXIT /B diff --git a/Script/Object.List.CMD b/Script/Object.List.CMD new file mode 100644 index 0000000..58bcea4 --- /dev/null +++ b/Script/Object.List.CMD @@ -0,0 +1,16 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ +:: 2: ("")/ʽ({0}ռλ, {1}ֵռλ) + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@ECHO OFF +SETLOCAL +SET "@PREFIX=%~1." +IF DEFINED %2 (CALL SET "@CMD=%%%2%%") ELSE (SET "@CMD=%~2") +Powershell.EXE -Command "& { Get-Item Env:${Env:@PREFIX}* | ForEach-Object {$PSItem.Name = $PSItem.Name.Substring(${Env:@PREFIX}.Length); $PSItem} | Where-Object {$PSItem.Name -match '^[^.]+$'} | Sort-Object -Property Name | ForEach-Object {${Env:@CMD} -f $PSItem.Name,$PSItem.Value} }" +ENDLOCAL +EXIT /B diff --git a/Script/Object.ListAll.CMD b/Script/Object.ListAll.CMD new file mode 100644 index 0000000..041adf1 --- /dev/null +++ b/Script/Object.ListAll.CMD @@ -0,0 +1,16 @@ +::@author FB +::@version 0.1.0 + +::ȫ +:: 1: ʵ +:: 2: ("")/ʽ({0}ռλ, {1}ֵռλ) + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@ECHO OFF +SETLOCAL +SET "@PREFIX=%~1." +IF DEFINED %2 (CALL SET "@CMD=%%%2%%") ELSE (SET "@CMD=%~2") +Powershell.EXE -Command "& { Get-Item Env:${Env:@PREFIX}* | ForEach-Object {$PSItem.Name = $PSItem.Name.Substring(${Env:@PREFIX}.Length); $PSItem} | Where-Object {$PSItem.Name -match '^.+$'} | Sort-Object -Property Name | ForEach-Object {${Env:@CMD} -f $PSItem.Name,$PSItem.Value} }" +ENDLOCAL +EXIT /B diff --git a/Script/Object.ListSub.CMD b/Script/Object.ListSub.CMD new file mode 100644 index 0000000..ea257a3 --- /dev/null +++ b/Script/Object.ListSub.CMD @@ -0,0 +1,16 @@ +::@author FB +::@version 0.1.0 + +:: +:: 1: ʵ +:: 2: ("")/ʽ({0}ռλ) + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@ECHO OFF +SETLOCAL +SET "@PREFIX=%~1." +IF DEFINED %2 (CALL SET "@CMD=%%%2%%") ELSE (SET "@CMD=%~2") +Powershell.EXE -Command "& { Get-ChildItem Env:${Env:@PREFIX}* -Name | ForEach-Object {$PSItem.Substring(${Env:@PREFIX}.Length)} | Where-Object {$PSItem -match '^[^.]+\.[^.]+$'} | ForEach-Object {$PSItem.split('.') | Select-Object -First 1} | Sort-Object -Unique | ForEach-Object {${Env:@CMD} -f $PSItem,''} }" +ENDLOCAL +EXIT /B diff --git a/Script/Powershell.Replace.CMD b/Script/Powershell.Replace.CMD new file mode 100644 index 0000000..4d0d88d --- /dev/null +++ b/Script/Powershell.Replace.CMD @@ -0,0 +1,23 @@ +::@author FB +::@version 0.1.0 + +::Powershellַ滻 +:: 1: ַ/("") +:: 2: ַ/("") +:: 3: ַ/("") +:: @: ַ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@ECHO OFF +SETLOCAL +IF DEFINED %1 (CALL SET "@STR=%%%1%%") ELSE (SET "@STR=%~1") +IF DEFINED %2 (CALL SET "@OLD=%%%2%%") ELSE (SET "@OLD=%~2") +IF DEFINED %3 (CALL SET "@NEW=%%%3%%") ELSE (SET "@NEW=%~3") +FOR /F "usebackq delims=" %%A IN ( + `Powershell.EXE -Command "& { ${Env:@STR} -Replace [regex]::Escape(${Env:@OLD}),${Env:@NEW} }"` +) DO ( + SET "@=%%~A" +) +ENDLOCAL & SET "@=%@%" +EXIT /B diff --git a/Script/Registry.Add.CMD b/Script/Registry.Add.CMD new file mode 100644 index 0000000..54eb0f2 --- /dev/null +++ b/Script/Registry.Add.CMD @@ -0,0 +1,13 @@ +::@author FB +::@version 0.1.0 + +::ע +:: 1: ע· +:: 2: ע +:: 3: ע +:: 4: עֵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +REG.EXE ADD "%~1" /V "%~2" /T "%~3" /D "%~4" /F 1>NUL 2>&1 +EXIT /B diff --git a/Script/Registry.Delete.CMD b/Script/Registry.Delete.CMD new file mode 100644 index 0000000..e2af18a --- /dev/null +++ b/Script/Registry.Delete.CMD @@ -0,0 +1,15 @@ +::@author FB +::@version 0.1.0 + +::עɾ +:: 1: ע· +:: 2: ע(ʱɾ·) + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +IF "%~2" == "" ( + REG.EXE DELETE "%~1" /F 1>NUL 2>&1 +) ELSE ( + REG.EXE DELETE "%~1" /V "%~2" /F 1>NUL 2>&1 +) +EXIT /B diff --git a/Script/Registry.Query.CMD b/Script/Registry.Query.CMD new file mode 100644 index 0000000..0f67227 --- /dev/null +++ b/Script/Registry.Query.CMD @@ -0,0 +1,18 @@ +::@author FB +::@version 0.1.0 + +::ȡעֵ +:: 1: ע· +:: 2: ע +:: @: עֵ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET "@=" +FOR /F "tokens=1,2,* usebackq" %%A IN ( + `CALL REG.EXE QUERY "%~1" /V "%~2" 2^>NUL` +) DO ( + IF /I "%%~A" == "%~2" SET "@=%%~C" +) +IF "%@%" == "" EXIT /B 1 +EXIT /B diff --git a/Script/String.Trim.CMD b/Script/String.Trim.CMD new file mode 100644 index 0000000..78bfe99 --- /dev/null +++ b/Script/String.Trim.CMD @@ -0,0 +1,26 @@ +::@author FB +::@version 0.2.0 + +::ʹ(SET "@=%*")ҲԴﵽͬĿ +::޷ʹ˫Ű, Ż + +::֪: ޷TAB + +::ȥβո +:: 1: Ŀַ +:: @: ַ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +SET "@=%~1" +:_TRIM_START +IF NOT "%@%" == "" IF "%@:~,1%" == " " ( + SET "@=%@:~1%" + GOTO :_TRIM_START +) +:_TRIM_END +IF NOT "%@%" == "" IF "%@:~-1%" == " " ( + SET "@=%@:~,-1%" + GOTO :_TRIM_END +) +EXIT /B diff --git a/WinEnv.cmd b/WinEnv.cmd new file mode 100644 index 0000000..daaf6df --- /dev/null +++ b/WinEnv.cmd @@ -0,0 +1,188 @@ +:: +::@author FB +::@version 0.1.0 + +::Script:Config.ArgParser.CMD:: +::Script:Config.FileRead.CMD:: +::Script:Config.FileWrite.CMD:: +::Script:Object.Destroy.CMD:: +::Script:Object.ListAll.CMD:: +::Script:Registry.Query.CMD:: +::Script:Registry.Add.CMD:: +::Script:Registry.Delete.CMD:: +::Script:Powershell.Replace.CMD:: + +::ʼ +@ECHO OFF +SETLOCAL +CD /D "%~dp0" +SET "PATH=%CD%\Bin;%CD%\Script;%PATH%" +SET "EXIT_CODE=0" +CALL Object.Destroy.CMD "ARG" +CALL Object.Destroy.CMD "CONFIG" +CALL Object.Destroy.CMD "CONFIG_OLD" +:: +CALL Config.ArgParser.CMD "ARG" %* +IF "%ARG.OPTION.O%" == "1" ( + SET "OPTION=/D 1 /T 0" +) ELSE IF "%ARG.OPTION.O%" == "2" ( + SET "OPTION=/D 2 /T 0" +) ELSE IF "%ARG.OPTION.O%" == "3" ( + SET "OPTION=/D 3 /T 0" +) ELSE ( + SET "OPTION=" +) +IF "%ARG.PARAM.0%" == "" ( + SET "CONFIG=%~n0.ini" + SET "CONFIG_OLD=%~n0.old" +) ELSE IF /I "%ARG.PARAM.0:~-4%" == ".ini" ( + SET "CONFIG=%ARG.PARAM.0%" + SET "CONFIG_OLD=%ARG.PARAM.0:~,-4%.old" +) ELSE ( + SET "CONFIG=%ARG.PARAM.0%.ini" + SET "CONFIG_OLD=%ARG.PARAM.0%.old" +) +:: +ECHO. +ECHO ============================================ +ECHO ======= ====== +ECHO ============================================ +:: +IF /I "%ARG.OPTION.H%" == "TRUE" ( + ECHO. + ECHO : %~nx0 [ļ[.ini]] [/o^|-o ^<1^|2^|3^>] [/h^|-h] + ECHO. + ECHO - ļ + ECHO ָļ·, ʡ`.ini`. + ECHO ļļ, չΪ`.old`. + ECHO Ĭļ`%~n0.ini`, Ĭϱļ`%~n0.old`. + ECHO. + ECHO - /o ^| -o + ECHO ָҪִеIJ. + ECHO ѡ, `1`û, `2`ָ, `3`˳. + ECHO ĬΪȴûѡ. + ECHO. + ECHO - /h ^| -h + ECHO ʾ + ECHO. + SET "OPTION=ANY" + GOTO :EXIT +) +::ѡ˵ +ECHO. +ECHO ***** ע: ܶϵͳƻ ***** +ECHO. +ECHO 1:û +ECHO 2:ָ +ECHO 3:˳ +ECHO. +CHOICE /C:123 %OPTION% /M "ѡ:" +GOTO :OP_%ERRORLEVEL% + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:OP_1 +::ȡļ +ECHO. +ECHO ļ: %CONFIG% +IF NOT EXIST "%CONFIG%" ( + ECHO. + ECHO.***** , ļڣ***** + SET "EXIT_CODE=404" + GOTO :EXIT +) +CALL Config.FileRead.CMD "CONFIG" "%CONFIG%" +FOR /F "usebackq delims=" %%A IN (`SET "CONFIG." 2^>NUL`) DO (CALL SET "%%~A") +::ע· +IF /I "%CONFIG.SCOPE%" == "MACHINE" ( + SET "_REG_PATH=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" +) ELSE ( + SET "_REG_PATH=HKEY_CURRENT_USER\Environment" +) +::ݻ +SET "CONFIG_OLD.SCOPE=%CONFIG.SCOPE%" +FOR %%A IN ("REPLACE","APPEND","INSERT") DO ( + FOR /F "usebackq delims=" %%I IN ( + `CALL Object.ListAll.CMD "CONFIG.%%~A" "{0}"` + ) DO ( + SET "_KEY=%%~I" + CALL Registry.Query.CMD "%%_REG_PATH%%" "%%_KEY%%" || SET "@=(Removed)" + CALL SET "CONFIG_OLD.REPLACE.%%_KEY%%=%%@%%" + ) +) +FOR /F "usebackq delims=" %%A IN (`SET "CONFIG_OLD." 2^>NUL`) DO ( + SET "_STR=%%~A" & CALL Powershell.Replace.CMD _STR "%%%%" "%%%%%%%%" + CALL SET "%%@%%" +) +CALL Config.FileWrite.CMD "CONFIG_OLD" "%CONFIG_OLD%" +::û +FOR /F "tokens=1,* usebackq delims==" %%A IN ( + `CALL Object.ListAll.CMD "CONFIG.REPLACE" "{0}={1}"` +) DO ( + SET "_KEY=%%~A" & SET "_VALUE=%%~B" + CALL ECHO %%_KEY%%=%%_VALUE%% + IF /I "%%~B" == "(Removed)" ( + CALL Registry.Delete.CMD "%%_REG_PATH%%" "%%_KEY%%" + ) ELSE ( + CALL Registry.Add.CMD "%%_REG_PATH%%" "%%_KEY%%" "REG_EXPAND_SZ" "%%_VALUE%%" + ) +) +FOR /F "tokens=1,* usebackq delims==" %%A IN ( + `CALL Object.ListAll.CMD "CONFIG.APPEND" "{0}={1}"` +) DO ( + SET "_KEY=%%~A" & SET "_VALUE=%%~B" + CALL Registry.Query.CMD "%_REG_PATH%" "%%_KEY%%" + CALL ECHO %%_KEY%%=%%@%%%%_VALUE%% + CALL Registry.Add.CMD "%_REG_PATH%" "%%_KEY%%" "REG_EXPAND_SZ" "%%@%%%%_VALUE%%" +) +FOR /F "tokens=1,* usebackq delims==" %%A IN ( + `CALL Object.ListAll.CMD "CONFIG.INSERT" "{0}={1}"` +) DO ( + SET "_KEY=%%~A" & SET "_VALUE=%%~B" + CALL Registry.Query.CMD "%_REG_PATH%" "%%_KEY%%" + CALL ECHO %%_KEY%%=%%_VALUE%%%%@%% + CALL Registry.Add.CMD "%_REG_PATH%" "%%_KEY%%" "REG_EXPAND_SZ" "%%_VALUE%%%%@%%" +) +GOTO :EXIT + +:OP_2 +::ȡ +ECHO. +ECHO ļ: %CONFIG_OLD% +IF NOT EXIST "%CONFIG_OLD%" ( + ECHO. + ECHO.***** , ļڣ***** + SET "EXIT_CODE=404" + GOTO :EXIT +) +CALL Config.FileRead.CMD "CONFIG_OLD" "%CONFIG_OLD%" +FOR /F "usebackq delims=" %%A IN (`SET "CONFIG_OLD." 2^>NUL`) DO (CALL SET "%%~A") +::ע· +IF /I "%CONFIG.SCOPE%" == "MACHINE" ( + SET "_REG_PATH=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" +) ELSE ( + SET "_REG_PATH=HKEY_CURRENT_USER\Environment" +) +::û +FOR /F "tokens=1,* usebackq delims==" %%A IN ( + `CALL Object.ListAll.CMD "CONFIG_OLD.REPLACE" "{0}={1}"` +) DO ( + SET "_KEY=%%~A" & SET "_VALUE=%%~B" + CALL ECHO %%_KEY%%=%%_VALUE%% + IF /I "%%~B" == "(Removed)" ( + CALL Registry.Delete.CMD "%%_REG_PATH%%" "%%_KEY%%" + ) ELSE ( + CALL Registry.Add.CMD "%%_REG_PATH%%" "%%_KEY%%" "REG_EXPAND_SZ" "%%_VALUE%%" + ) +) +GOTO :EXIT + +:OP_3 +:OP_0 +:EXIT +IF "%OPTION%" == "" ( + ECHO. + ECHO + PAUSE >NUL +) +ENDLOCAL & EXIT /B %EXIT_CODE% diff --git a/WinEnv.ini b/WinEnv.ini new file mode 100644 index 0000000..daad612 --- /dev/null +++ b/WinEnv.ini @@ -0,0 +1,11 @@ +SCOPE=USER + +[REPLACE] +JAVA_HOME=%CD%\JDK11 +POWERSHELL_HOME=%CD%\POWERSHELL7 + +[APPEND] +PATH=;%%JAVA_HOME%%\Bin + +[INSERT] +PATH=%%POWERSHELL_HOME%%;