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
相关推荐
世人万千丶15 小时前
Flutter 框架跨平台鸿蒙开发 - 恐惧清单应用
学习·flutter·华为·开源·harmonyos·鸿蒙
yuzhuanhei15 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
此刻觐神16 小时前
IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
linux·服务器·学习
憧憬从前16 小时前
算法学习记录DAY2
学习
babe小鑫16 小时前
会计岗位学习数据分析的价值分析
学习·数据挖掘·数据分析
千枫s16 小时前
电脑vm虚拟机kali linux安装shannon
学习·网络安全
zjnlswd16 小时前
tkinter学习案例--笔记代码
笔记·学习
咬_咬16 小时前
go语言学习(基本数据类型)
开发语言·学习·golang·数据类型
山甫aa16 小时前
List 容器 -----C++的stl学习
开发语言·c++·学习
无聊大侠hello world17 小时前
Yu-AI-Agent 项目(AI 恋爱大师智能体) · 学习笔记
人工智能·笔记·学习