中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 06:17
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » [求助][讨论]字符串截取的问题
可打印版本  1,049 / 9
第1楼 onlyu2000 发表于 2010-06-01 11:05
新手上路 发帖 14 积分 15
[求助][讨论]字符串截取的问题
在我需要做的是在FOR循环中,用%string:~A,B%的形式对字符串截取,而且string、A、B都是变量,这样能实现吗?

貌似系统不会对!符号做嵌套分析
第2楼 nickwu 发表于 2010-06-01 11:33
新手上路 发帖 8 积分 8
这个问题偶碰到过
好像是可以的
我写了个演示程序,希望对你有所启发


关键之处在于call和%%
第3楼 onlyu2000 发表于 2010-06-01 11:56
新手上路 发帖 14 积分 15
谢谢楼上,我的意思是string、a 和b的值在for中都会变化,需要加延迟变量特性并用!a!,!b!来表示,这样写就是有重叠的!!符号,系统不会嵌套分解
第4楼 nickwu 发表于 2010-06-01 12:03
新手上路 发帖 8 积分 8
能贴一些原代码吗,好帮你分析
第5楼 onlyu2000 发表于 2010-06-01 12:13
新手上路 发帖 14 积分 15
@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
set FN=%%~na
call strstr !FN! _By /I
set pos=!errorlevel!
set var=!FN:~0,!pos!!
echo !var!
)
pause
第6楼 onlyu2000 发表于 2010-06-01 12:15
新手上路 发帖 14 积分 15
其中strstr 是一个我写的查找字符串位置的批处理文件
用%errorlevel%返回结果

本意是要去除文件名中“_By”及其之后的字符

[ Last edited by onlyu2000 on 2010-6-1 at 12:23 ]
第7楼 nickwu 发表于 2010-06-01 13:54
新手上路 发帖 8 积分 8
办法总会有滴
吃完饭回来继续测试,发现以下代码效果极佳~~


其实延迟变量的问题不一定非要用setlocal enabledelayedexpansion来解决,
用call也行,可能是出于简洁的考虑,我不大喜欢用setlocal enabledelayedexpansion,
所以我写的代码一般都不会有setlocal enabledelayedexpansion,当然也就不会出现用!感叹号来进行引用的变量
这一点希望你理解,我觉得不管用什么办法,只要能达到目的就行。

修改并优化了一下你的代码,如下:


测试下代码看行不行
因为里面有你自己写的程序,所以
我这里无法保证你写的代码最终都是正确的,需要你自己去测试运行
另外这里给你编写代码提个建议
用set给字符串变量赋值的时候,最好带上引号,这样兼容性会好点
如:set FN="%%~na"

[ Last edited by nickwu on 2010-6-1 at 14:37 ]
第8楼 onlyu2000 发表于 2010-06-01 15:27
新手上路 发帖 14 积分 15
谢谢楼上了,我试试看
第9楼 Hanyeguxing 发表于 2010-06-01 16:20
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
1,嵌套的基本方法:
2,在for中一般不推荐使用call:
①,因为call的因为效率低,for的循环次数越多越明显
②,同时使用call嵌套变量会将使for所能使用的变量名减少,例如使用了call set a=%%%%a:~%%b%%,%%c%%%%%%,意味for 就不能使用%%a、%%b、%%c。
所以在实际使用中,尽量使用变量延迟和for来替代call做变量嵌套。
第10楼 onlyu2000 发表于 2010-06-01 16:23
新手上路 发帖 14 积分 15
发现把原来的: set var=!FN:~0,!pos!!
改到另一文件里面:@set var=!FN:~0,%pos%!
然后再调用这个批处理就可以了。

nickwu的方法都在一个文件里面比较简洁,而且这种把call嵌套和%转义用得出神入化的方式我还需要慢慢理解 -_-!!

============================
LZ的方法放到FOR循环中有效吗?

[ Last edited by onlyu2000 on 2010-6-1 at 16:32 ]
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023