windows批处理通过%var:~start,length%实现字符串截取,支持正负索引和省略长度;拼接用%var1%%var2%直接连接,需避免空格;受限于无正则、特殊字符需延迟扩展处理。
windows 批处理(.bat)中没有原生的字符串函数,但可以通过 变量扩展语法 实现字符串截取和拼接,关键在于掌握 %var:~start,length% 和 %var1%%var2% 这两类用法。
字符串截取:用 :~ 语法提取子串
批处理通过 %变量名:~起始位置,长度% 截取字符串。起始位置从 0 开始,支持负数(表示从末尾倒数),长度可省略(截取到末尾)。
-
截取前3个字符:
set str=HelloWorld && echo %str:~0,3%→ 输出Hel -
从第5位开始截取剩余全部:
echo %str:~5%→World -
取最后4个字符:
echo %str:~-4%→orld -
去掉前2个、去掉后2个:
echo %str:~2,-2%→lloWorl
字符串拼接:直接连接变量或字面量
拼接无需特殊命令,把变量或字符串紧挨着写即可,注意空格会被当作分隔符,需避免多余空格。
-
变量+变量:
set a=abc && set b=def && set c=%a%%b% && echo %c%→abcdef -
变量+常量:
set path=C:\ && set full=%path%Users && echo %full%→C:\Users -
带下划线拼接:
set name=John && set ver=2.1 && echo %name%_%ver%→John_2.1
实用技巧:结合截取与拼接处理文件名或路径
常见需求如提取文件名、扩展名、目录路径,可组合使用截取与延迟扩展(setlocal enabledelayedexpansion)应对循环中变量变化。
-
获取不带扩展名的文件名:
set file=test.txt && echo %file:~0,-4%→test(假设扩展名固定为 .txt) -
提取扩展名(最后一个点之后):
for /f "delims=." %%a in ("%file%") do set ext=%%a && echo %ext%不够可靠;更稳妥用for /f "delims=" %%i in ('echo %file% ^| powershell -c "$env:__=$args[0]; $env:__ -replace '.*\.(.*)','$1'"') do set ext=%%i,但纯批处理建议用%file:*.=%(仅适用于单个点,如readme.md→md) -
拼接路径时防错:用引号包裹 + 去除重复反斜杠:
set base=C:\temp && set sub=logs && set full="%base%\%sub%",后续用cd /d %full%
注意事项与限制
批处理字符串操作能力有限:不支持正则、大小写转换需借助 PowerShell 或外部工具;变量内容含特殊符号(如 &、|、)会引发解析错误,应启用延迟扩展并用 <code>!var! 引用。
- 所有截取操作在
set语句中即时生效,但不能嵌套(如%str:~0,%len%%不合法,需先算出len再调用) - 空格是敏感字符,拼接时确保等号前后无空格:
set a=b正确,set a = b会把空格存入变量值 - 若字符串含
!,必须关闭延迟扩展或转义,否则被误解析











