批处理脚本字符串过滤异常求助:文件名截取失败
批处理变量替换问题解析
咱们先把问题拆解开,你遇到的核心是对批处理变量替换的语法规则理解偏差,我给你一步步捋清楚:
为什么获取文件夹名的脚本能正常工作?
你的GetFolderName脚本里用的%temp2:*\=%是完全符合批处理变量替换规则的:
- 这个格式
%var:*str=%的作用是:从变量开头开始,删除直到第一个出现的str(包括str本身)的所有内容 - 比如当
temp2是C:\test\demo\file.txt时,第一次执行%temp2:*\=%会删掉C:\得到test\demo\file.txt,循环执行后最终剩下demo,完全符合你要的文件夹名逻辑,所以能正常输出。
为什么文件名处理脚本失效?
你写的echo %temp1:-*=%是错误用法——批处理的变量替换里根本没有:-*=这种格式,这里的*不会被当作“任意字符”的通配符解析,而是被当成字面量的*字符。也就是说,这个命令只会把temp1里所有的-*子串替换为空,但你的文件名里并没有-*,所以输出自然和原变量一模一样。
正确的文件名处理方法
你的目标是把project_Name_-_sofeware_Name(%~n1的结果)处理成project_Name,本质是要删除从_-开始的所有后续内容。正确的替换语法是%var:str*=%,它的作用是:从变量中找到第一个出现的str,删除该str及之后的所有内容。
针对你的场景,修改后的脚本可以这样写:
@echo off set "temp1=%~n1" :: 找到第一个 "_-" 并删除它及后面的所有内容 set "result=%temp1:_-*=%" :: 加上后缀 .txt echo %result%.txt
如果你的文件名里的分隔符是_-_(比如project_Name_-_software_Name),把替换的子串改成_-_会更准确:
set "result=%temp1:_-_*=%"
这样就能输出你想要的project_Name.txt了。
补充:批处理变量替换常用格式
给你整理几个实用的替换格式,方便后续参考:
%var:old=new%:将变量中所有old替换为new%var:*old=%:删除开头到第一个old(含old)的内容%var:old*=%:删除第一个old(含old)到结尾的内容%var:~n%:从第n个字符开始取内容(n从0开始计数)%var:~-n%:取变量最后n个字符%var:~m,n%:从第m个字符开始,取n个字符
内容的提问来源于stack exchange,提问作者Hsu Amanda
相关产品推荐
相关产品推荐

