bat学习
bash
@echo off
:: 设置编码为utf8
chcp 65001 >nul 2>&1
:: 设置local
setlocal enabledelayedexpansion
:: %var%:静态替换,适用于大多数普通场景,但在循环或条件块中无法获取变量更新后的值。
:: !var!:动态替换,必须在 setlocal enabledelayedexpansion 下使用,适合需要实时获取变量变化的场合。
:: 获取当前文件夹,并将最后一个 \ 给去掉
FOR %%F IN ("%~dp0") DO SET "__curr_dir=%%~dpF"
SET "__curr_dir=%__curr_dir:~0,-1%"
echo 当前目录为 %__curr_dir%
:: 构建要设置的环境变量
SET "UV_VAR_NAME=UV_HOME"
SET "UV_VAR_VALUE=%__curr_dir%"
SET "UV_CACHE_DIR=%__curr_dir%\uv_cache"
SET "UV_PYTHON_INSTALL_DIR=%__curr_dir%\uv_python"
SET "UV_TOOL_DIR=%__curr_dir%\uv_tool"
SET "UV_PYTHON_INSTALL_MIRROR=https://registry.npmmirror.com/-/binary/python-build-standalone"
:: 先设置一下PATH
:: SET "PATH=%__curr_dir%;%PATH%"
:: 设置UV的命令文件
SET "UV_EXE=%__curr_dir%\uv.exe"
:: 判断文件是否存在
if not exist "%UV_EXE%" (
echo 错误:未找到文件 %UV_EXE%
exit /b 1
)
:: 获取UV的版本信息
%UV_EXE% self version
:: 开始设置USER环境变量
SET /p choice_set_path=请选择 (y/n):
if /i "%choice_set_path%" == "n" (
echo 不设置环境变量到 Path 中,执行结束
exit /b 0
)
echo =======================================
echo 开始执行设置环境变量到 PATH 中
SET /p choice_set_user_or_sys=请选择 (u/s):
if /i "%choice_set_user_or_sys%" == "u" (
echo 设置环境变量到当前用户的 Path 中
set "SET_LEVEL=USER"
set "PATH_REG_PATH=HKCU\Environment"
) else (
echo 设置环境变量到系统的 Path 中
set "SET_LEVEL=SYSTEM"
set "PATH_REG_PATH=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
)
:: 读取当前Path
for /f "tokens=2*" %%a in ('reg query "%PATH_REG_PATH%" /v "Path" 2^>nul') do (
set "CURRENT_PATH=%%b"
)
echo !CURRENT_PATH! | find /i %UV_VAR_NAME% >nul 2>&1
if !errorLeve! equ 0 (
echo Path中已经存在%UV_VAR_NAME%环境变量
pause
exit /b 1
)
:: 拼接新的Path
set "NEW_PATH=!CURRENT_PATH!;%%%UV_VAR_NAME%%%"
echo !NEW_PATH!
:: 先设置环境变量
reg add %PATH_REG_PATH% /v "%%%UV_VAR_NAME%%%" /d "%UV_VAR_VALUE%" /f
:: 再加入Path中
reg add %PATH_REG_PATH% /v "Path" /d !NEW_PATH! /f
echo.
echo 注册表设置结束,请关闭终端,重新运行
echo ==============================================================
pause
endlocal
exit /b 0
shell
@echo off
:: 设置编码为utf8
chcp 65001 >nul 2>&1
:: 设置local
setlocal enabledelayedexpansion
FOR %%F IN ("%~dp0") DO SET "__curr_dir=%%~dpF"
SET "__curr_dir=%__curr_dir:~0,-1%"
echo 当前目录为 %__curr_dir%
set "HOME_VAR=NVM_HOME"
set "NVM_DIR=%__curr_dir%\nvm"
set "LINK_VAR=NVM_SYMLINK"
set "NODE_JS_DIR=%__curr_dir%\nodejs"
echo 设置nvm的配置
set "NVM_EXE=%NVM_DIR%\nvm.exe"
%NVM_EXE% version
::%NVM_EXE% node_mirror https://npmmirror.com/mirrors/node/
::%NVM_EXE% npm_mirror https://npmmirror.com/mirrors/npm/
::setx NVM_HOME "%CURRENT_DIR%"
::setx NVM_SYMLINK "%NODE_JS_DIR%"
::setx PATH "%PATH%;^%NVM_HOME^%;^%NVM_SYMLINK^%"
set "USER_REG_PATH=HKCU\Environment"
echo.
echo 设置用户级环境变量
reg add %USER_REG_PATH% /v "%HOME_VAR%" /t REG_SZ /d "%NVM_DIR%" /f
reg add %USER_REG_PATH% /v "%LINK_VAR%" /t REG_SZ /d "%NODE_JS_DIR%" /f
echo 读取%USER_REG_PATH%的 path 值
for /f "tokens=2*" %%a in ('reg query "%USER_REG_PATH%" /v "Path" 2^>nul') do (
set "CURRENT_USER_PATH=%%b"
)
echo.
echo 判断是否存在 %%%HOME_VAR%%%
set "temp1=!CURRENT_USER_PATH:%%%HOME_VAR%%%=!"
if "!temp1!" neq "!CURRENT_USER_PATH!" (
echo %%%HOME_VAR%%% 存在 USER_PATH
) else (
echo %%%HOME_VAR%%% 不存在 USER_PATH
SET "NEW_USER_PATH=!CURRENT_USER_PATH!;%%%HOME_VAR%%%;%%%LINK_VAR%%%"
reg add "%USER_REG_PATH%" /v "Path" /t REG_EXPAND_SZ /d "!NEW_USER_PATH!" /f
echo "%USER_REG_PATH%"设置结束
)
echo ===========================================
echo 设置系统级环境变量
net session >nul 2>&1
if !errorLevel! neq 0 (
echo 错误:设置系统级环境变量需要管理员权限!
echo 请右键点击本脚本,选择"以管理员身份运行"。
pause
exit /b 1
)
set "SYS_REG_PATH=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
reg add "%SYS_REG_PATH%" /v "%HOME_VAR%" /t REG_EXPAND_SZ /d "%NVM_DIR%" /f
reg add "%SYS_REG_PATH%" /v "%LINK_VAR%" /t REG_EXPAND_SZ /d "%NODE_JS_DIR%" /f
echo 读取%SYS_REG_PATH%的 path 值
for /f "tokens=2*" %%a in ('reg query "%SYS_REG_PATH%" /v "Path" 2^>nul') do (
set "CURRENT_SYS_PATH=%%b"
)
echo 判断是否存在 %%%HOME_VAR%%%
echo !CURRENT_SYS_PATH! | find /i "%HOME_VAR%" >nul 2>&1
set "temp2=!CURRENT_SYS_PATH:%%%HOME_VAR%%%=!"
if "!temp2!" neq "!CURRENT_SYS_PATH!" (
echo %%%HOME_VAR%%% 存在 SYS_PATH
) else (
echo %%%HOME_VAR%%% 不存在 SYS_PATH
SET "NEW_SYS_PATH=!CURRENT_SYS_PATH!;%%%HOME_VAR%%%;%%%LINK_VAR%%%"
reg add "%SYS_REG_PATH%" /v "Path" /t REG_EXPAND_SZ /d "!NEW_SYS_PATH!" /f
echo "%SYS_REG_PATH%"设置结束
)
REM 暂停以查看输出
pause
endlocal
exit /b 0
判断字符串是否存在
"%PATH:;=";"%"拆分 PATH"!CURRENT_USER_PATH:;=";"!"拆分 PATHC:\A;C:\B;C:\C->"C:\A";"C:\B";"C:\C"然后for %%p逐个遍历/I → 忽略大小写%%~p → 去掉引号后的真实路径完全相等匹配(避免子串误判)
bash
@echo off
:: 设置编码为utf8
chcp 65001 >nul 2>&1
:: 设置local
setlocal enabledelayedexpansion
set "HOME_VAR=NVM_HOME"
set "USER_REG_PATH=HKCU\Environment"
set "TARGET=%%%HOME_VAR%%%"
echo %TARGET%
echo 读取%USER_REG_PATH%的 path 值
for /f "tokens=2*" %%a in ('reg query "%USER_REG_PATH%" /v "Path" 2^>nul') do (
set "CURRENT_USER_PATH=%%b"
)
for %%p in ("!CURRENT_USER_PATH:;=";"!") do (
if /I "%%~p"=="%TARGET%" (
set FOUND=1
)
)
if "!FOUND!" == "1" (
echo "%TARGET%" 存在 !CURRENT_USER_PATH!
)
::echo !CURRENT_USER_PATH! | find /i "%HOME_VAR%" >nul
set "temp=!CURRENT_USER_PATH:%%%HOME_VAR%%%=!"
if "!temp!" neq "!CURRENT_USER_PATH!" (
echo "%HOME_VAR%" 存在 !CURRENT_USER_PATH!
) else (
echo "%HOME_VAR%" 不存在 !CURRENT_USER_PATH!
)
REM 暂停以查看输出
pause
endlocal
exit /b 0
最终版本:
bash
@echo off
setlocal enabledelayedexpansion
set "TARGET=%UV_HOME%"
if "%TARGET:~-1%"=="\" set "TARGET=%TARGET:~0,-1%"
set "FOUND="
for %%p in ("%PATH:;=";"%") do (
set "CUR=%%~p"
if "!CUR:~-1!"=="\" set "CUR=!CUR:~0,-1%"
if /I "!CUR!"=="%TARGET%" (
set FOUND=1
)
)
if defined FOUND (
echo UV_HOME 已在 PATH 中
) else (
echo UV_HOME 不在 PATH 中
)
pause
endlocal
exit /b 0
shell
@echo off
:: 设置编码为utf8
chcp 65001 >nul 2>&1
:: 设置local
setlocal enabledelayedexpansion
set "HOME_VAR=NVM_HOME"
set "USER_REG_PATH=HKCU\Environment"
set "TARGET=%%%HOME_VAR%%%"
echo %TARGET%
echo 读取%USER_REG_PATH%的 path 值
for /f "tokens=2*" %%a in ('reg query "%USER_REG_PATH%" /v "Path" 2^>nul') do (
set "CURRENT_USER_PATH=%%b"
)
for %%p in ("!CURRENT_USER_PATH:;=";"!") do (
if /I "%%~p"=="%TARGET%" (
set FOUND=1
)
)
if "!FOUND!" == "1" (
echo "%TARGET%" 存在 !CURRENT_USER_PATH!
)
::echo !CURRENT_USER_PATH! | find /i "%HOME_VAR%" >nul
set "temp=!CURRENT_USER_PATH:%%%HOME_VAR%%%=!"
if "!temp!" neq "!CURRENT_USER_PATH!" (
echo "%HOME_VAR%" 存在 !CURRENT_USER_PATH!
) else (
echo "%HOME_VAR%" 不存在 !CURRENT_USER_PATH!
)
REM 暂停以查看输出
pause
endlocal
exit /b 0