bat学习

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:;=";"!" 拆分 PATH C:\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
相关推荐
蓝染k9z2 小时前
非技术人员 AI 使用学习全历程研究报告
人工智能·学习
盐水冰2 小时前
【烘焙坊项目】后端搭建(13)- 数据统计--图形报表
java·后端·学习·spring
朗迹 - 张伟2 小时前
UE5 UMG学习笔记
笔记·学习·ue5
jinanwuhuaguo2 小时前
AI应用开发与自动化工具全景解析:Coze、Dify、FastGPT、n8n、MCP、Manus、Claude Code、OpenClaw
人工智能·学习·重构·新人首发·openclaw
EnglishJun2 小时前
ARM嵌入式学习(六) --- ARM基础介绍和相关专业术语讲解
arm开发·学习
我要成为嵌入式大佬2 小时前
正点原子MP157嵌入式学习驱动开发--问题详解(一--Ubuntu根分区扩容速解)
学习
booksyhay3 小时前
XCP协议学习笔记
网络·笔记·学习
计算机魔术师3 小时前
一键沉浸式体验:清华开源OpenMAIC,重塑多智能体学习新范式
学习·typescript·开源·多智能体·openmaic