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
相关推荐
MartinYeung518 小时前
[论文学习]透过增强式 Few-Shot Learning 实现高效 PII 从大型语言模型中提取
人工智能·学习·语言模型
公考指南针18 小时前
公务员面试怎么准备?2026 结构化面试流程、答题训练和备考工具测评
经验分享·学习·面试
.千余18 小时前
【C++】C++继承入门(上):继承语法与基本特性详解
开发语言·c++·笔记·学习·其他
承渊政道18 小时前
【MySQL数据库学习】MySQL基本查询(下)
数据库·学习·mysql·leetcode·bash·数据库开发·数据库系统
skywalk816318 小时前
段言的设计文档:中文编程赛道的竞争格局,谁在牌桌上?
开发语言·学习·编程
段一凡-华北理工大学18 小时前
工业领域的Hadoop架构学习~系列文章24:adoop工业应用总结与展望 - 技术路线图与最佳实践
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
一锅炖出任易仙19 小时前
创梦汤锅学习日记day30
学习·ai·ue5·游戏引擎
AOwhisky19 小时前
Redis 学习笔记(第二期):核心数据类型与消息队列实战
运维·数据库·redis·笔记·学习·云计算
keira67419 小时前
个人健康日程表(小时级行为系统)
学习·生活
YangYang9YangYan19 小时前
专科大数据技术学习数据分析的价值分析
大数据·学习·数据分析